#property strict
#property indicator_chart_window //將這個指標秀在主圖上
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() //這個函式只在程式開始前執行一次
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---寫出目前價格
iSetLable("ClosePrice", "Price:"+DoubleToStr(iClose(Symbol(),0,0),4), 10, 5, 12, "Arial", Yellow);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
void iSetLable(string LableName, string LableDoc, int LableX, int LableY, int DocSize, string DocStyle, color DocColor){ //此函式參考自索羅斯都要用的外匯交易術
ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0); //建立物件和它的名稱
ObjectSetText(LableName, LableDoc, DocSize, DocStyle, DocColor); //物件要秀出的文本內容
ObjectSet(LableName, OBJPROP_XDISTANCE, LableX); //X座標
ObjectSet(LableName, OBJPROP_XDISTANCE, LableY); // Y座標
}
標籤
二元樹
(1)
字串常數池
(1)
投資
(3)
每月損益
(37)
例外處理
(1)
泛型
(2)
股票
(15)
指標
(5)
英文
(8)
基本資料型別
(1)
期貨
(1)
程式交易
(10)
量化投資
(5)
亂亂寫
(3)
概念
(3)
資料結構
(3)
演算法
(3)
數學
(3)
轉型
(1)
AMA
(1)
ArrayList
(1)
assert
(1)
BeautifulSoup
(1)
C/C++
(8)
casting
(1)
ClassCastException
(1)
classpath
(1)
Collection
(4)
Comparable
(1)
comparTo()
(1)
constructor
(1)
database
(3)
Debian
(1)
Dropbox
(2)
EA
(2)
enum
(1)
equals()
(2)
exception
(3)
extends
(1)
ffmpeg
(1)
final
(1)
Git
(1)
HashMap
(1)
HashSet
(1)
hasNext()
(1)
HTS
(3)
instanceof
(1)
IS-A
(1)
Iterator
(1)
JAVA
(43)
length
(1)
Linux
(31)
List
(1)
Mac
(6)
Map
(1)
ML
(2)
MT4
(6)
MySQL
(2)
next()
(1)
NullPointerException
(1)
Number
(1)
Numpy
(2)
OpenCart
(1)
OpenCV
(3)
OSX
(1)
overloading
(1)
overriding
(3)
pandas
(2)
PHP
(8)
PriorityQueue
(1)
Python
(11)
Queue
(1)
random()
(1)
reverse()
(1)
Samba
(1)
SCJP
(21)
sqrt()
(1)
synchronized
(1)
talib
(1)
ufw
(1)
uTorrent
(1)
var-args
(2)
VHF
(1)
vim
(2)
Yhoo知識+
(4)
2016年5月6日 星期五
2016年4月21日 星期四
LSS通道
上下通道表示支撐及壓力,所突破就做多,跌破做空,只限日內交易。
公式參考自:http://rane1220.pixnet.net/blog/post/48867946
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Yellow
double buffer1[];
double buffer2[];
int init(){
int draw_begin;
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,buffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,buffer2);
return 0;
}
int start(){
int limit = Bars - IndicatorCounted();
for(int i=0; i<limit; i++){
buffer1[i] = LssUp(i);
buffer2[i] = LssDown(i);
}
return 0;
}
double LssUp(int shift){
double upv, buv, dup, lssup;
shift++;
upv = iLow(NULL,0,shift) + (iHigh(NULL,0,shift) - iLow(NULL,0,shift+1) +
iHigh(NULL,0,shift+1) - iLow(NULL,0,shift+2) +
iHigh(NULL,0,shift+2) - iLow(NULL,0,shift+3))/3;
buv = iHigh(NULL,0,shift) + (iHigh(NULL,0,shift) - iHigh(NULL,0,shift+1) +
iHigh(NULL,0,shift+1) - iHigh(NULL,0,shift+2) +
iHigh(NULL,0,shift+2) - iHigh(NULL,0,shift+3))/3;
dup = iHigh(NULL,0,shift);
lssup = 2*(iHigh(NULL,0,shift) + iLow(NULL,0,shift) + iClose(NULL,0,shift))/3 - iLow(NULL,0,shift);
return (upv+buv+dup+lssup)/4;
}
double LssDown(int shift){
double downv, bdv, ddown, lssdown;
shift++;
downv = iHigh(NULL,0,shift) - (iHigh(NULL,0,shift+1) - iLow(NULL,0,shift) +
iHigh(NULL,0,shift+2) - iLow(NULL,0,shift+1) +
iHigh(NULL,0,shift+3) - iLow(NULL,0,shift+2))/3;
bdv = iLow(NULL,0,shift) - (iLow(NULL,0,shift+1) - iLow(NULL,0,shift) +
iLow(NULL,0,shift+2) - iLow(NULL,0,shift+1) +
iLow(NULL,0,shift+3) - iLow(NULL,0,shift+2))/3;
ddown = iLow(NULL,0,shift);
lssdown = 2*(iHigh(NULL,0,shift) + iLow(NULL,0,shift) + iClose(NULL,0,shift))/3 - iHigh(NULL,0,shift);
return (downv+bdv+ddown+lssdown)/4;
}
公式參考自:http://rane1220.pixnet.net/blog/post/48867946
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Yellow
double buffer1[];
double buffer2[];
int init(){
int draw_begin;
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,buffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,buffer2);
return 0;
}
int start(){
int limit = Bars - IndicatorCounted();
for(int i=0; i<limit; i++){
buffer1[i] = LssUp(i);
buffer2[i] = LssDown(i);
}
return 0;
}
double LssUp(int shift){
double upv, buv, dup, lssup;
shift++;
upv = iLow(NULL,0,shift) + (iHigh(NULL,0,shift) - iLow(NULL,0,shift+1) +
iHigh(NULL,0,shift+1) - iLow(NULL,0,shift+2) +
iHigh(NULL,0,shift+2) - iLow(NULL,0,shift+3))/3;
buv = iHigh(NULL,0,shift) + (iHigh(NULL,0,shift) - iHigh(NULL,0,shift+1) +
iHigh(NULL,0,shift+1) - iHigh(NULL,0,shift+2) +
iHigh(NULL,0,shift+2) - iHigh(NULL,0,shift+3))/3;
dup = iHigh(NULL,0,shift);
lssup = 2*(iHigh(NULL,0,shift) + iLow(NULL,0,shift) + iClose(NULL,0,shift))/3 - iLow(NULL,0,shift);
return (upv+buv+dup+lssup)/4;
}
double LssDown(int shift){
double downv, bdv, ddown, lssdown;
shift++;
downv = iHigh(NULL,0,shift) - (iHigh(NULL,0,shift+1) - iLow(NULL,0,shift) +
iHigh(NULL,0,shift+2) - iLow(NULL,0,shift+1) +
iHigh(NULL,0,shift+3) - iLow(NULL,0,shift+2))/3;
bdv = iLow(NULL,0,shift) - (iLow(NULL,0,shift+1) - iLow(NULL,0,shift) +
iLow(NULL,0,shift+2) - iLow(NULL,0,shift+1) +
iLow(NULL,0,shift+3) - iLow(NULL,0,shift+2))/3;
ddown = iLow(NULL,0,shift);
lssdown = 2*(iHigh(NULL,0,shift) + iLow(NULL,0,shift) + iClose(NULL,0,shift))/3 - iHigh(NULL,0,shift);
return (downv+bdv+ddown+lssdown)/4;
}
區間突破策略
常聽到的是突破/跌破8:45~9:00就進場做多/空,我寫了一個可以突破任意時間前的高低才進場的EA,測了一下好像10點以後才進場比較好。不過參考就好,因為MT4的回測資料品質爛死惹(只能測到最近2個月的5分K)。
摩台指2/18~4/21,一天只進場一次
#property copyright "2016, Bill Chen"
input double Lots = 0.1;
input int hands = 1;
extern int theMagicNum = 3732;
extern double startTime = 8.75;
extern double sendTime = 9;
extern double endTime = 13.5;
input string str4= "Timeframes 1,5,15,30,60,...";
input int MATrendPeriod = 15;
double takeProfit, highest15, lowest15;
datetime lastBarTime;
int flag = 0;
void OnTick(void){
int cnt,ticket,total, symbolOrders;
double curTime = (Hour()+12)%24 + Minute()/60.0;
if(Month()==11 || Month()==12 || Month()==1 || Month()==2) curTime++;
if(Bars<100){
Print("bars less than 100");
return;
}
total=OrdersTotal();
symbolOrders = 0;
if(curTime==sendTime){
int kbarnum = (sendTime-startTime)/0.083;
highest15 = iHigh(NULL,MATrendPeriod,iHighest(NULL,MATrendPeriod,MODE_HIGH,kbarnum,0));
lowest15 = iLow(NULL,MATrendPeriod,iLowest(NULL,MATrendPeriod,MODE_LOW,kbarnum,0));
takeProfit = highest15 - lowest15;
flag = 0;
}
for(cnt=0; cnt<total; cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum) symbolOrders++;
}
//------send orders starts -------
if( symbolOrders < hands && (curTime>=sendTime && curTime<=endTime-0.05) && flag==0){
if(AccountFreeMargin() < (1000*Lots)){
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
if(iClose(NULL,MATrendPeriod,0) > highest15){
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0, 0,"AMAtrading v.0.1.3", theMagicNum,0,Green); flag=1;
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){ Print("BUY order opened : ",OrderOpenPrice());
}else Print("Error opening BUY order : ",GetLastError());
return;
}
}else if(iClose(NULL,MATrendPeriod,0) < lowest15){ //v.0.1.2
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3, 0, 0,"AMAtrading v.0.1.3", theMagicNum,0,Red); flag=1;
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){ Print("SELL order opened : ",OrderOpenPrice());
}else Print("Error opening SELL order : ",GetLastError());
return;
}
}
}//------send orders ends -------
//-----orders handle starts-------
for(cnt=0;cnt<total;cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum){
if(OrderType()==OP_BUY){
if(iClose(NULL,MATrendPeriod,0)<OrderOpenPrice()-takeProfit/2 || (Bid-OrderOpenPrice())>takeProfit*2 || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}else{
if(iClose(NULL,MATrendPeriod,0)>OrderOpenPrice()+takeProfit/2 || (OrderOpenPrice()-Ask)>takeProfit*2 || curTime>=endTime ){
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}
}
}//-----orders handle ends-------
}
摩台指2/18~4/21,一天只進場一次
#property copyright "2016, Bill Chen"
input double Lots = 0.1;
input int hands = 1;
extern int theMagicNum = 3732;
extern double startTime = 8.75;
extern double sendTime = 9;
extern double endTime = 13.5;
input string str4= "Timeframes 1,5,15,30,60,...";
input int MATrendPeriod = 15;
double takeProfit, highest15, lowest15;
datetime lastBarTime;
int flag = 0;
void OnTick(void){
int cnt,ticket,total, symbolOrders;
double curTime = (Hour()+12)%24 + Minute()/60.0;
if(Month()==11 || Month()==12 || Month()==1 || Month()==2) curTime++;
if(Bars<100){
Print("bars less than 100");
return;
}
total=OrdersTotal();
symbolOrders = 0;
if(curTime==sendTime){
int kbarnum = (sendTime-startTime)/0.083;
highest15 = iHigh(NULL,MATrendPeriod,iHighest(NULL,MATrendPeriod,MODE_HIGH,kbarnum,0));
lowest15 = iLow(NULL,MATrendPeriod,iLowest(NULL,MATrendPeriod,MODE_LOW,kbarnum,0));
takeProfit = highest15 - lowest15;
flag = 0;
}
for(cnt=0; cnt<total; cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum) symbolOrders++;
}
//------send orders starts -------
if( symbolOrders < hands && (curTime>=sendTime && curTime<=endTime-0.05) && flag==0){
if(AccountFreeMargin() < (1000*Lots)){
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
if(iClose(NULL,MATrendPeriod,0) > highest15){
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0, 0,"AMAtrading v.0.1.3", theMagicNum,0,Green); flag=1;
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){ Print("BUY order opened : ",OrderOpenPrice());
}else Print("Error opening BUY order : ",GetLastError());
return;
}
}else if(iClose(NULL,MATrendPeriod,0) < lowest15){ //v.0.1.2
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3, 0, 0,"AMAtrading v.0.1.3", theMagicNum,0,Red); flag=1;
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){ Print("SELL order opened : ",OrderOpenPrice());
}else Print("Error opening SELL order : ",GetLastError());
return;
}
}
}//------send orders ends -------
//-----orders handle starts-------
for(cnt=0;cnt<total;cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum){
if(OrderType()==OP_BUY){
if(iClose(NULL,MATrendPeriod,0)<OrderOpenPrice()-takeProfit/2 || (Bid-OrderOpenPrice())>takeProfit*2 || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}else{
if(iClose(NULL,MATrendPeriod,0)>OrderOpenPrice()+takeProfit/2 || (OrderOpenPrice()-Ask)>takeProfit*2 || curTime>=endTime ){
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}
}
}//-----orders handle ends-------
}
2016年3月26日 星期六
AMA 5分線,摩台2016.0105~0324
AMA 5分線,連續兩次波動進場,K棒整支低於或高於AMA出場。
摩台2016.0105~0324,交易時間:9:00到13:45
結果很糟,盤整根本被巴假的。
程式碼:
input double Lots = 0.1;
input int hands = 1;
input int theMagicNum = 332;
extern double startTime = 8.75;
extern double endTime = 13.75;
input string str4= "AMA Trading short and long Timeframes 1,5,15,30,60,...";
input int MATrendPeriod = 5;
void OnTick(void){
double theAMAupCurrent, theAMAupPrevious, theAMAdownCurrent, theAMAdownPrevious;
int cnt,ticket,total, symbolOrders;
int TradeMode = 1;
double curTime = (Hour()+12)%24 + Minute()/60.0;
if(Month()==1 || Month()==2) curTime++;
if(Bars<100){
Print("bars less than 100");
return;
}
theAMAupCurrent = iCustom(NULL, MATrendPeriod, "AMA", 1, 0);
theAMAupPrevious = iCustom(NULL, MATrendPeriod, "AMA", 1, 1);
theAMAdownCurrent = iCustom(NULL, MATrendPeriod, "AMA", 2, 0);
theAMAdownPrevious = iCustom(NULL, MATrendPeriod, "AMA", 2, 1);
total=OrdersTotal();
symbolOrders = 0;
for(cnt=0; cnt<total; cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum) symbolOrders++;
}
//------send orders starts -------
if( symbolOrders < hands && (curTime>=startTime && curTime<=endTime-0.05)){
if(AccountFreeMargin() < (1000*Lots)){
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
if( (theAMAupCurrent>theAMAupPrevious && theAMAupPrevious!=0) ){ //v.0.1
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0, 0,"AMAtrading v.0.1", theMagicNum,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}else Print("Error opening BUY order : ",GetLastError());
return;
}else if( (theAMAdownCurrent<theAMAdownPrevious && theAMAdownPrevious!=0)){ //v.0.1
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3, 0, 0,"AMAtrading v.0.1", theMagicNum,0,Red);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}else Print("Error opening SELL order : ",GetLastError());
return;
}
}//------send orders ends -------
//-----orders handle starts-------
for(cnt=0;cnt<total;cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum ){
if(OrderType()==OP_BUY){
if( iHigh(NULL,MATrendPeriod,0)< iCustom(NULL,MATrendPeriod,"AMA",0,0) || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}else{
if(iLow(NULL,MATrendPeriod,0)> iCustom(NULL,MATrendPeriod,"AMA",0,0) || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}
}
}
}
摩台2016.0105~0324,交易時間:9:00到13:45
結果很糟,盤整根本被巴假的。
程式碼:
input double Lots = 0.1;
input int hands = 1;
input int theMagicNum = 332;
extern double startTime = 8.75;
extern double endTime = 13.75;
input string str4= "AMA Trading short and long Timeframes 1,5,15,30,60,...";
input int MATrendPeriod = 5;
void OnTick(void){
double theAMAupCurrent, theAMAupPrevious, theAMAdownCurrent, theAMAdownPrevious;
int cnt,ticket,total, symbolOrders;
int TradeMode = 1;
double curTime = (Hour()+12)%24 + Minute()/60.0;
if(Month()==1 || Month()==2) curTime++;
if(Bars<100){
Print("bars less than 100");
return;
}
theAMAupCurrent = iCustom(NULL, MATrendPeriod, "AMA", 1, 0);
theAMAupPrevious = iCustom(NULL, MATrendPeriod, "AMA", 1, 1);
theAMAdownCurrent = iCustom(NULL, MATrendPeriod, "AMA", 2, 0);
theAMAdownPrevious = iCustom(NULL, MATrendPeriod, "AMA", 2, 1);
total=OrdersTotal();
symbolOrders = 0;
for(cnt=0; cnt<total; cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum) symbolOrders++;
}
//------send orders starts -------
if( symbolOrders < hands && (curTime>=startTime && curTime<=endTime-0.05)){
if(AccountFreeMargin() < (1000*Lots)){
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
if( (theAMAupCurrent>theAMAupPrevious && theAMAupPrevious!=0) ){ //v.0.1
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0, 0,"AMAtrading v.0.1", theMagicNum,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}else Print("Error opening BUY order : ",GetLastError());
return;
}else if( (theAMAdownCurrent<theAMAdownPrevious && theAMAdownPrevious!=0)){ //v.0.1
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3, 0, 0,"AMAtrading v.0.1", theMagicNum,0,Red);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}else Print("Error opening SELL order : ",GetLastError());
return;
}
}//------send orders ends -------
//-----orders handle starts-------
for(cnt=0;cnt<total;cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum ){
if(OrderType()==OP_BUY){
if( iHigh(NULL,MATrendPeriod,0)< iCustom(NULL,MATrendPeriod,"AMA",0,0) || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}else{
if(iLow(NULL,MATrendPeriod,0)> iCustom(NULL,MATrendPeriod,"AMA",0,0) || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
}
}
}
}
2016年3月25日 星期五
三重濾網
參考這篇文章寫出來的MT4版本。不過MT4沒有台指期,而且回測也不精準,所以跑出來(我測摩台)的績效沒有文章那麼好。
input double Lots = 0.1;
input int hands = 1;
void OnTick(void){
int cnt,total;
if(Bars<100){
Print("bars less than 100"); return;
}
total=OrdersTotal();
if(total < hands){
if(AccountFreeMargin() < (1000*Lots)){
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
if(iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,0)>iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,1) &&
iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_MAIN, 0)<95 && iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0)<95 &&
iClose(NULL, 5, 0)>iMA(NULL, 5, 35, 8, MODE_SMA, PRICE_CLOSE, 0)){
OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0,0,"3ScreensSystem", 1234,0,Green); return;
}
if(iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,0)<iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,1) &&
iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_MAIN, 0)>5 && iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0)>5 &&
iClose(NULL, 5, 0)<iMA(NULL, 5, 45, 8, MODE_SMA, PRICE_CLOSE, 0)){
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"3ScreensSystem", 1234,0,Red); return;
}
}
for(cnt=0;cnt<total;cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()){
if(OrderType()==OP_BUY){
if(iClose(NULL,5,0)-OrderOpenPrice()>2){
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return;
}else if(OrderOpenPrice()-iClose(NULL,5,0)>0.5){
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return;
}
}else{
if(OrderOpenPrice()-iClose(NULL,5,0)>2){
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return;
}else if(iClose(NULL,5,0)-OrderOpenPrice()>0.5){
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return;
}
}
}
}
}
input double Lots = 0.1;
input int hands = 1;
void OnTick(void){
int cnt,total;
if(Bars<100){
Print("bars less than 100"); return;
}
total=OrdersTotal();
if(total < hands){
if(AccountFreeMargin() < (1000*Lots)){
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
if(iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,0)>iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,1) &&
iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_MAIN, 0)<95 && iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0)<95 &&
iClose(NULL, 5, 0)>iMA(NULL, 5, 35, 8, MODE_SMA, PRICE_CLOSE, 0)){
OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0,0,"3ScreensSystem", 1234,0,Green); return;
}
if(iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,0)<iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,1) &&
iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_MAIN, 0)>5 && iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0)>5 &&
iClose(NULL, 5, 0)<iMA(NULL, 5, 45, 8, MODE_SMA, PRICE_CLOSE, 0)){
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"3ScreensSystem", 1234,0,Red); return;
}
}
for(cnt=0;cnt<total;cnt++){
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()){
if(OrderType()==OP_BUY){
if(iClose(NULL,5,0)-OrderOpenPrice()>2){
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return;
}else if(OrderOpenPrice()-iClose(NULL,5,0)>0.5){
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return;
}
}else{
if(OrderOpenPrice()-iClose(NULL,5,0)>2){
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return;
}else if(iClose(NULL,5,0)-OrderOpenPrice()>0.5){
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return;
}
}
}
}
}
2016年3月6日 星期日
MT4內建的MACD EA程式註解
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"
input double TakeProfit =50; //停利點數
input double Lots =0.1; //每次下單0.1口
input double TrailingStop =30; //獲利達30點時,啟動移動停利
input double MACDOpenLevel =3; //MACD快線在0軸上下3點時,才可觸發多空單
input double MACDCloseLevel=2; //MACD快線在0軸上下2點時,才可觸發平倉
input int MATrendPeriod =26;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick(void)
{
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
if(Bars<100){
Print("bars less than 100"); //K棒小於100根,程式退出
return;
}
if(TakeProfit<10){
Print("TakeProfit less than 10"); //輸入停利小於10點,程式退出
return;
}
//--- to simplify the coding and speed up access data are put into internal variables
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); //抓目前K棒的MACD快線值
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); //抓上一根K棒的MACD快線值
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); //抓目前K棒的MACD慢線值
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //抓上一根K棒的MACD慢線值
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); //抓目前K棒的MA值
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); //抓上一根K棒的MA值
total=OrdersTotal(); //取得帳戶所有單子數量
if(total<1){
//--- no opened orders identified
if(AccountFreeMargin() < (1000*Lots)){ //如果原始保證金小於 1000*交易口數,結束程式(1口*1000 = 下1口的原始保證金)
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- 偵測觸發buy單條件
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && //如果MACD快線在0軸下,又與慢線金叉
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious){ //而且快線在0軸下3點以上,又均線上升
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); //則下buy單,不停損,50停利
if(ticket>0){ //若下buy單成功,印出buy單價格
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}else
Print("Error opening BUY order : ",GetLastError()); //若失敗則印出錯誤訊息,結束程式
return;
}
//--- 偵測觸發sell單條件
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && //如果MACD快線在0軸上,又與慢線死叉
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious){ //而且快線在0軸上3點以上,又均線下降{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); //則下sell單,不停損,50停利
if(ticket>0){ //若下sell單成功,印出sell單價格
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}else
Print("Error opening SELL order : ",GetLastError()); //若失敗則印出錯誤訊息,結束程式
}
//--- exit from the "no opened orders" block
return;
}
//--- 移動停損及停利
for(cnt=0;cnt<total;cnt++){ //走訪所有訂單
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()){ // 如果是本商品
//--- 如果是buy單
if(OrderType()==OP_BUY){
//--- 如果MACD在0軸上死叉,而且快線大於0軸3點以上
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point)){
//--- 平倉buy 單
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
//--- 移動停利
if(TrailingStop>0){ //如果有設停利啟動點
if(Bid-OrderOpenPrice() > Point*TrailingStop){ //如果獲利超過30點
if(OrderStopLoss() < Bid-Point*TrailingStop){ //如果獲利大於停利點
//--- 動態變更停利點
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}else{ // 如果是sell單
//--- 如果MACD在0軸下金叉,且快線小於0軸3點以上
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)){
//--- 平倉sell單
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
//--- 移動停利
if(TrailingStop>0){ //如果有設停利啟動點
if((OrderOpenPrice()-Ask) > (Point*TrailingStop)){ //如果獲利超過30點
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)){ //目前點數小於停利點
//--- 動態變更停利點
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"
input double TakeProfit =50; //停利點數
input double Lots =0.1; //每次下單0.1口
input double TrailingStop =30; //獲利達30點時,啟動移動停利
input double MACDOpenLevel =3; //MACD快線在0軸上下3點時,才可觸發多空單
input double MACDCloseLevel=2; //MACD快線在0軸上下2點時,才可觸發平倉
input int MATrendPeriod =26;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick(void)
{
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
if(Bars<100){
Print("bars less than 100"); //K棒小於100根,程式退出
return;
}
if(TakeProfit<10){
Print("TakeProfit less than 10"); //輸入停利小於10點,程式退出
return;
}
//--- to simplify the coding and speed up access data are put into internal variables
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); //抓目前K棒的MACD快線值
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); //抓上一根K棒的MACD快線值
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); //抓目前K棒的MACD慢線值
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //抓上一根K棒的MACD慢線值
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); //抓目前K棒的MA值
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); //抓上一根K棒的MA值
total=OrdersTotal(); //取得帳戶所有單子數量
if(total<1){
//--- no opened orders identified
if(AccountFreeMargin() < (1000*Lots)){ //如果原始保證金小於 1000*交易口數,結束程式(1口*1000 = 下1口的原始保證金)
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- 偵測觸發buy單條件
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && //如果MACD快線在0軸下,又與慢線金叉
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious){ //而且快線在0軸下3點以上,又均線上升
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); //則下buy單,不停損,50停利
if(ticket>0){ //若下buy單成功,印出buy單價格
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}else
Print("Error opening BUY order : ",GetLastError()); //若失敗則印出錯誤訊息,結束程式
return;
}
//--- 偵測觸發sell單條件
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && //如果MACD快線在0軸上,又與慢線死叉
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious){ //而且快線在0軸上3點以上,又均線下降{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); //則下sell單,不停損,50停利
if(ticket>0){ //若下sell單成功,印出sell單價格
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}else
Print("Error opening SELL order : ",GetLastError()); //若失敗則印出錯誤訊息,結束程式
}
//--- exit from the "no opened orders" block
return;
}
//--- 移動停損及停利
for(cnt=0;cnt<total;cnt++){ //走訪所有訂單
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()){ // 如果是本商品
//--- 如果是buy單
if(OrderType()==OP_BUY){
//--- 如果MACD在0軸上死叉,而且快線大於0軸3點以上
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point)){
//--- 平倉buy 單
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
//--- 移動停利
if(TrailingStop>0){ //如果有設停利啟動點
if(Bid-OrderOpenPrice() > Point*TrailingStop){ //如果獲利超過30點
if(OrderStopLoss() < Bid-Point*TrailingStop){ //如果獲利大於停利點
//--- 動態變更停利點
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}else{ // 如果是sell單
//--- 如果MACD在0軸下金叉,且快線小於0軸3點以上
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)){
//--- 平倉sell單
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError());
return;
}
//--- 移動停利
if(TrailingStop>0){ //如果有設停利啟動點
if((OrderOpenPrice()-Ask) > (Point*TrailingStop)){ //如果獲利超過30點
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)){ //目前點數小於停利點
//--- 動態變更停利點
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+
訂閱:
文章 (Atom)




