大家要参加ATC2011的请来报道,组团参加。

Discussion in 'MetaTrader' started by liubin730020, Dec 17, 2010.

  1. mql4 的文章 和bobsley的策略有关
     
  2. 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);
    }
    //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
    /*
     
  3. 这是我的,用的均线系统,我简称为棉花团策略,看了就知道了,很简单的

    //+------------------------------------------------------------------+

    //| 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;





    }

    //+------------------------------------------------------------------+
     
  4. 我的思想是,假想一根棉线沿着均线走,当线头向上穿越线尾时买入,当线头向下穿越线尾时卖出,棉线的时间跨度,沿哪条均线走,还有止损,都是全局优化出来的,长度66,这是我失败的主要原因,这方法在短期震荡市场中用处不大,而我用的又是超短线,所以策略失败在所难免。
     
  5. 外汇交易的特点是24小时不间断,当日有“回复”现象,所以如果用长期趋势跟踪的方法会导致日内收益波动性大。比赛领先的策略多数都有止赢目标的现象存在。3个月周期的比赛不太适合采用长周期的趋势跟踪,短周期趋势跟踪相对会好些。
    按理采用超短线策略的盈利稳定性应该较好。
     
  6. 快到截至时间了,可现在www.mql5.com 本周很难上去了。
     
  7. 刚才用ATC2010第四名avoitenko公布的那个EA跑了下测试,在2010的比赛期间2010-10-1至2011-1-1的成绩模拟测试优异!可如果选择2011的时间段2011-1-1至2011-6-1之间的模拟测试结果就完全不同了,差异巨大!
     
  8. 第10名的所有货币的最后仓位基本都以亏损平掉。
    第3名的头寸管理确保了前段的净值一路上升,至于后段走平,是因为达到了每单最大5手的限制后,不懂如何再多开单,如果他解决了这个问题,冠军应属他。
     
  9. 第4名avoitenko的2个版本的EA测试了一下,2010-9-1至2010-12-31和2011-1-1至2011-9-1的成绩结果差异太大了。
     
  10. 正常啊,优化的结果
     
  11. 那不就成撞大运了,谁也无法预先知道比赛阶段的走势.
     
  12. 不可思议!
     
  13. 有运气的成分,06年第一届起,每年的前三都没有在之后有过好表现
     
  14. 历年名次:

    2006: Rich, ldamiani, GODZILLA
    2007: Better, wackena, Pegasmaster
    2008: Liliput, PrizmaL, abeiks
    2010: bobsley, Buter, forez
     
  15. 好像如果持有头寸超过5手以上平仓时也需要一次平仓不超过5手,分多次才能平仓完毕。
     
  16. 可惜,由于种种原因今年没有参加。
    不过倒可以更冷静的看别人的代码了。