2.mq4 大家可以发现,他的方法憾事很简单的。 //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // Грааль_2.mq4. // Используется в качестве примера в статье "Мой первый Грааль". // Сергей Ковалёв, Днепропетровск, sk@mail.dnepr.net, ICQ 64015987, http://autograf.dp.ua/. //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж extern int TakeProfit=5; // TakeProfit ордера extern int StopLoss= 29; // StopLoss ордера extern int Distan = 2; // Дистанция от средней МА extern int Cls = 2; // Закрыть при ** пнктов прибыли extern int period_MA=16; // Период средней МА //extern int Time_1 = 0; // Время начала работы //extern int Time_2 = 0; // Время окончания работы extern int Prots = 0; // Процент от свободных средств //-------------------------------------------------------------------------------------------- int Nom_bl, // Номер ордера BuyLimit Nom_sl, // Номер ордера SellLimit total, // Количество лотов bl = 0, // 1 = факт налиия ордера BuyLimit sl = 0, // 1 = факт налиия ордера SellLimit b = 0, // 1 = факт налиия ордера Buy s = 0; // 1 = факт налиия ордера Sell //-------------------------------------------------------------------------------------------- double OP, // OpenPrice (абсолютн. пунктов) SL, // StopLoss ордера (относит.пункт.) TP, // TakeProfit ордера (относит.пункт.) dist, // Дистанция от средней МА(отн.пун.) Level, // Миним. допуст дистанция отл.орд OP_bl, // OpenPrice BuyLimit (абс. пунктов) OP_sl, // OpenPrice SellLimit(абс. пунктов) cls, // Закрыть при ** прибыли (абс. пун.) MA, // Значение МА (курс) spred, // Спред (абс. пунктов) Lot; // Количество лотов //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int init() { Level=MarketInfo(Symbol(),MODE_STOPLEVEL); // Выясним что нам даёт сервер Level=(Level+1)*Point; // ? SL=StopLoss*Point; // StopLoss ордера (относит.пункт.) TP=TakeProfit*Point; // TakeProfit ордера (относит.пункт.) dist=Distan*Point; // Дистанция от средней МА(отн.пун.) cls=Cls*Point; // Закрыть при ** прибыли (абс. пун.) spred=Ask-Bid; // Спред (абс. пунктов) return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int start() { //============================================================================================ total=OrdersTotal(); // Количество лотов bl=0; // Обнулимся в начале прохода sl=0; // Обнулимся в начале прохода b=0; // Обнулимся в начале прохода s=0; // Обнулимся в начале прохода //-------------------------------------------------------------------------------------------- for (int i=total; i>=0; i--) // По всем ордерам { if (OrderSelect(i,SELECT_BY_POS)==true && // Выделим ордер OrderSymbol()==Symbol()) { //-------------------------------------------------------------------------------------------- if (OrderType()==OP_BUY) // Ордер Buy { b =1; // Есть такой ордер Close_B(OrderTicket(),OrderLots()); // Закрыть ордер (надо ли решит ф-ия) } //-------------------------------------------------------------------------------------------- if (OrderType()==OP_SELL) // Ордер Sell { s =1; // Есть такой ордер Close_S(OrderTicket(),OrderLots()); // Закрыть ордер (если надо) } //-------------------------------------------------------------------------------------------- if (OrderType()==OP_BUYLIMIT) // Ордер BuyLimit { OP_bl=NormalizeDouble(OrderOpenPrice(),Digits);//OpenPrice BuyLimit(абс. пунктов) Nom_bl=OrderTicket(); bl=1; // Есть такой ордер } //-------------------------------------------------------------------------------------------- if (OrderType()==OP_SELLLIMIT) // ОрдерSellLimit { OP_sl=NormalizeDouble(OrderOpenPrice(),Digits);//OpenPrice SellLimit(абс.пунктов) Nom_sl=OrderTicket(); sl=1; // Есть такой ордер } //-------------------------------------------------------------------------------------------- } } //-------------------------------------------------------------------------------------------- MA = iMA(NULL,0, period_MA, 0,MODE_LWMA, PRICE_TYPICAL, 0);// Текущее значение МА Modify_order(); // Активизируем модификацию Open_order() ; // Активизируем открытие //============================================================================================ return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж void Close_B(int Nomber, double lots) // Закрытие ордеров Buy { //============================================================================================ if (NormalizeDouble(Bid-OrderOpenPrice(),Digits)>=cls)// Если достигнут заданный профит { OrderClose( Nomber, lots, Bid, 1, Yellow); // Закрываемся b = 0; // И больше нет бая } //============================================================================================ return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж void Close_S(int Nomber, double lots) // Закрытие ордеров Sell { //============================================================================================ if (NormalizeDouble(OrderOpenPrice()-Ask,Digits)>=cls)// Если достигнут заданный профит { OrderClose( Nomber, lots, Ask, 1, Yellow); // Закрываемся s = 0; // И больше нет селла } //============================================================================================ return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж void Modify_order() // Модификация ордеров { //============================================================================================ if (bl==1) // Если есть БайЛимит { OP=MA-dist; // Он должен стоять здесь if (MathAbs(OP_bl-OP)>0.5*Point) // А если он здесь не стоит { OrderModify(Nom_bl,OP,OP-SL,OP+TP,0,DeepSkyBlue);// Модификация ордера } } //-------------------------------------------------------------------------------------------- if (sl==1) // Если есть СеллЛимит { OP=MA+spred+dist; // Он должен стоять здесь if (MathAbs(OP_sl-OP)>0.5*Point) // А если он здесь не стоит { OrderModify( Nom_sl, OP, OP+SL, OP-TP, 0, Pink);// Модификация ордера } } //============================================================================================ return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж void Open_order() // Открывающая функция { // int Tek_Time=TimeHour(CurTime()); // Для тестирования по времени // if (Tek_Time>Time_2 && Tek_Time<Time_1) return; // Для тестирования по времени //============================================================================================ if (b==0 && bl==0) // Нет никаких баёв, открываем bl { OP=MA-dist; // Курс открытия ордера bl if(OP>Ask-Level) OP=Ask-Level; // Уточнение ОР в соотв. с допуском OP=NormalizeDouble(OP,Digits); // Нормализация (МА даёт 5й знак) OrderSend(Symbol(),OP_BUYLIMIT, Lots(),OP,3,OP-SL,OP+TP,"",0,0,Blue);// Открываемся bl=1; // Теперь есть бай } //-------------------------------------------------------------------------------------------- if (s==0 && sl==0) // Нет никаких селов, открываем sl { OP=MA+spred+dist; // Курс открытия ордера sl if(OP<Bid+Level) OP=Bid+Level; // Уточнение ОР в соотв. с допуском OP=NormalizeDouble(OP,Digits); // Нормализация (МА даёт 5й знак) OrderSend(Symbol(),OP_SELLLIMIT,Lots(),OP,3,OP+SL,OP-TP,"",0,0,Red);// Открываемся sl=1; // Теперь есть sl } ///============================================================================================ return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж double Lots() // Вычисление лотов { //============================================================================================ Lot=NormalizeDouble(AccountEquity()*Prots/100/1000,1);// Вычисляем колич. лотов double Min_Lot = MarketInfo(Symbol(), MODE_MINLOT); // Минимально допустимая стоим. лотов if (Lot == 0 ) Lot = Min_Lot; // Для теста на постоян. миним. лотах //============================================================================================ return(Lot); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж /*
这是我的,用的均线系统,我简称为棉花团策略,看了就知道了,很简单的 //+------------------------------------------------------------------+ //| SHUFELB.mq5 | //| Copyright 2010, Liubin,Shanghai university of finance and econo | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, Liubin,Shanghai university of finance and economic" #property version "1.00" //+------------------------------------------------------------------+ //************************************ input int MA_Period=66; input int EA_Magic=12345; input double Lot=0.1; int maHandle; // handle for our Moving Average indicator double maVal[]; double p_close; double maxma; double minma; double peakmal; //************************************ int OnInit() { maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE); return(0); } //************************************ //| Expert deinitialization function | //************************************ //************************************ //************************************ //************************************ void OnTick() { //************************************ //************************************ static datetime Old_Time; datetime New_Time[1]; bool IsNewBar=false; int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) // ok, the data has been copied successfully { if(Old_Time!=New_Time[0]) { IsNewBar=true; if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time); Old_Time=New_Time[0]; // saving bar time } } else { Alert("Error in copying historical times data, error =",GetLastError()); ResetLastError(); return; } //************************************ if(IsNewBar==false) { return; } //************************************ int Mybars=Bars(_Symbol,_Period); if(Mybars<60) // if total bars is less than 60 bars { Alert("We have less than 60 bars, EA will now exit!!"); return; } //************************************ MqlTick latest_price; MqlTradeRequest mrequest; MqlTradeResult mresult; MqlRates mrate[]; //************************************ ArraySetAsSeries(mrate,true); //************************************ ArraySetAsSeries(maVal,true); //************************************ if(!SymbolInfoTick(_Symbol,latest_price)) { Alert("Error getting the latest price quote - error:",GetLastError(),"!!"); return; } //************************************ if(CopyRates(_Symbol,_Period,0,3,mrate)<0) { Alert("Error copying rates/history data - error:",GetLastError(),"!!"); ResetLastError(); return; } //************************************ if(CopyBuffer(maHandle,0,0,20,maVal)<0) { Alert("Error copying Moving Average indicator buffer - error:",GetLastError()); ResetLastError(); return; } //************************************ bool Buy_opened=false; // variable to hold the result of Buy opened position bool Sell_opened=false; if(PositionSelect(_Symbol)==true) { if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { Buy_opened=true; //Buy } else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { Sell_opened=true; // Sell } } //************************************ int i; maxma=0; minma=9999; for(i=0;i<=19;i++) {if(maxma<=maVal) {maxma=maVal;} if(maVal<=minma) {minma=maVal;} } peakmal=maVal[16]; // bar 1 close price bool Buy_Condition_1=(peakmal=minma); // lag 3 days ma66 is the highest==>buy if(Buy_Condition_1) { //************************************ if(Buy_opened) { Alert("We already have a Buy Position!!!"); return; } mrequest.action = TRADE_ACTION_DEAL; // immediate order execution mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // latest ask price mrequest.symbol = _Symbol; // currency pair mrequest.volume = Lot; // number of lots to trade mrequest.magic = EA_Magic; // Order Magic Number mrequest.type = ORDER_TYPE_BUY; // Buy Order mrequest.type_filling = ORDER_FILLING_AON; // Order execution type //--- send order OrderSend(mrequest,mresult); // get the result code if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed { Alert("A Buy order has been successfully placed with Ticket#:",mresult.order,"!!"); } else { Alert("The Buy order request could not be completed -error:",GetLastError()); ResetLastError(); return; } } //************************************ bool Sell_Condition_1 = (peakmal=maxma); // lag 3 days MA-66 is the highest value of recent 20 days if(Sell_Condition_1) {if(Sell_opened) { Alert("We already have a Sell position!!!"); return; } mrequest.action=TRADE_ACTION_DEAL; // immediate order execution mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // latest Bid price mrequest.symbol = _Symbol; // currency pair mrequest.volume = Lot; // number of lots to trade mrequest.magic = EA_Magic; // Order Magic Number mrequest.type= ORDER_TYPE_SELL; // Sell Order mrequest.type_filling = ORDER_FILLING_AON; // Order execution type //--- send order OrderSend(mrequest,mresult); // get the result code if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed { Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!"); } else { Alert("The Sell order request could not be completed -error:",GetLastError()); ResetLastError(); return; } } return; } //+------------------------------------------------------------------+
我的思想是,假想一根棉线沿着均线走,当线头向上穿越线尾时买入,当线头向下穿越线尾时卖出,棉线的时间跨度,沿哪条均线走,还有止损,都是全局优化出来的,长度66,这是我失败的主要原因,这方法在短期震荡市场中用处不大,而我用的又是超短线,所以策略失败在所难免。
外汇交易的特点是24小时不间断,当日有“回复”现象,所以如果用长期趋势跟踪的方法会导致日内收益波动性大。比赛领先的策略多数都有止赢目标的现象存在。3个月周期的比赛不太适合采用长周期的趋势跟踪,短周期趋势跟踪相对会好些。 按理采用超短线策略的盈利稳定性应该较好。
刚才用ATC2010第四名avoitenko公布的那个EA跑了下测试,在2010的比赛期间2010-10-1至2011-1-1的成绩模拟测试优异!可如果选择2011的时间段2011-1-1至2011-6-1之间的模拟测试结果就完全不同了,差异巨大!
历年名次: 2006: Rich, ldamiani, GODZILLA 2007: Better, wackena, Pegasmaster 2008: Liliput, PrizmaL, abeiks 2010: bobsley, Buter, forez