Пустые результаты при тестировании на истории

Я новичок в мире MQL4-кода.

Я родом из C++ и пытаюсь выучить MQL4 язык и правила.

Пишу простой советник (мой первый в жизни).
Он компилируется, но при попытке его протестировать завершается безрезультатно. Я прикрепляю код, чтобы лучше проиллюстрировать, что я пытаюсь сделать:

//+------------------------------------------------------------------+
//|                                                MyFirstExpert.mq4 |
//|                                                  Leonardo        |
//|                            http://investinmarkets.altervista.org |
//+------------------------------------------------------------------+
#property copyright "Leonardo "
#property link      "http://investinmarkets.altervista.org"
#property version   "1.00"
#property strict
input int BarCount = 3;
      int Ticket   = 0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() { 
     int    BarCountTemp = BarCount + 1;
     double bars[];
     ArrayResize( bars, BarCountTemp );
     for ( int i = 0; i < BarCountTemp; i++ ) {
           bars[i] = Close[i + 1];
     }
     int   i = 0;
     bool  is_p;
     do
     {
        if ( bars[i] > bars[i+1] && i < BarCountTemp ) is_p = true;
        else is_p = false;
        i++;
     }
     while ( is_p );

     if ( is_p == true && Ticket == 0 ) {
          Ticket = OrderSend(_Symbol,OP_SELL,0.1,Bid,0,0,0,"Sell Order Custom",110);
          Alert("Sell order opened to match found.");
          Comment("Sell order opened #"+Ticket+".");
     }
     if ( Ticket != 0 ) {
          bool select = OrderSelect(Ticket,SELECT_BY_TICKET);
          if ( Close[1] > Close[2] ) {
               bool close = OrderClose(Ticket,OrderLots(),Ask,0,clrGreen);
               Alert("Sell order closed.");
               Comment("Sell order closed #"+Ticket+".");
               Ticket = 0;
          }
     }
  }
//+------------------------------------------------------------------+

Я хочу просто подсчитать бары (введенные пользователем), а затем выполнить проверку: если, например. 3 бара все положительны, затем открываем ордер на продажу (на данный момент только в этом случае). Если открыт, следующий бар проверяется, остается ли он положительным, если нет, то закрываем сделку.

Я всегда получаю пустые результаты.

Заранее спасибо!


person Leonardo Urbano    schedule 24.08.2015    source источник


Ответы (1)


Добро пожаловать в мир MQL4, Леонардо.

давайте рассмотрим синтаксис:

for ( int i = 0; i < BarCountTemp; i++ ) {
      bars[i] = Close[i + 1];
     }
     int   i = 0;
     bool  is_p;
     do
     {
        if ( bars[i] > bars[i+1] && i < BarCountTemp ) is_p = true;
        else is_p = false;
        i++;
     }
     while ( is_p );

могут быть объединены/упрощены в единую конструкцию цикла/разрыва:

bool is_p = True;                          // FYI: FALSE if not initialised
                                           // WARNING: "New"-MQL4 has changed variable visibility-scope to be limited just to the innermost syntax-construct and variables easily "cease" exist outside that syntax-construct boundary ... for(){bool is_p ...visible...} ...invisible...
for ( int  i = 0;                          // .SET
           i < BarCountTemp;               // .TEST: [**]
           i++ ) {                         // .INC
           if (  Close[i+1] > Close[i+2]   // avoid TimeSeries' replica(s)
           // && i          < BarCountTemp // ALWAYS TRUE [^**]
              ) continue; // ---------------------------- LOOP-^
           else {
                is_p = False;
                break;    // ---------------------------- EXIT-v
}

Далее: есть хотя бы одно замечание Comment() в верхней части окна графика?

int   Ticket =  EMPTY;                        // Rather initialise as = EMPTY;

if (  is_p   == True
   && Ticket == EMPTY                         // un-ambiguous meaning
   ) {
      Ticket =  OrderSend( _Symbol,           // .SYM
                           OP_SELL,           // .OP
                           0.1,               // .LOTs check sizing, MarketInfo()
                           Bid,               // .PRICE
                           0,                 // .SLIPPAGE
                           0,                 // .SL
                           0,                 // .TP
                          "Sell Order Custom",// .COMMENT
                           110                // .MAGNUM
                           );
      if (  Ticket == EMPTY ){                // EXC. HANDLER
                  ...
      }
      else {
            Alert(   "Sell order opened to match found." );     // .NOP if isTesting()
            Comment( "Sell order opened #" + Ticket + "." );    // .GUI is visible????
      }
}

Наконец: включите обработчики исключений для случаев, когда может появиться ошибка

 if (  Ticket   != EMPTY               // TEST 1st,
    && Close[1] >  Close[2]            // TEST 2nd, prevent dbPool-ops, if not True
    ) {
             bool select = OrderSelect( Ticket, SELECT_BY_TICKET );
             if (!select ){           // EXC. HANDLER
                  ...
             }
             bool close  = OrderClose(  Ticket,
                                        OrderLots(),
                                        Ask,
                                        0,
                                        clrGreen
                                        );
             if (!close ){           // EXC. HANDLER
                  ...
             }
             Alert(   "Sell order closed." );
             Comment( "Sell order closed #" + Ticket + "." );
             Ticket = EMPTY;                            // .SET EMPTY
       }
 }
person user3666197    schedule 25.08.2015
comment
Спасибо @user3666197! Я ценю ваш ответ. Я пытаюсь попрактиковаться в том, что правильно, а что нельзя, исходя из фона C++ в MQL4, но это проще, чем я ожидал. Кроме того, мне очень нравится, как организован код в MQL4. Еще раз спасибо! - person Leonardo Urbano; 25.08.2015
comment
Рад тебя слышать, Леонардо, тем более, что код тебе понравился. Да, в низкоинтенсивном HFT нужно позаботиться о том, чтобы сбрить наносекунды, где это возможно, и, таким образом, чистота кода и повторное использование значений во многом помогают во время выполнения поддерживать задержку обработки на минимально возможном уровне. Некоторые функции даже лучше маршалируются вне MQL4 (в GPU, в облако/сетку), чтобы работать еще быстрее. - person user3666197; 25.08.2015
comment
Я согласен. Я много лет изучаю эту тему во многих университетах, и это то, чем я хочу заниматься на практике! Я рад найти кого-то, кто может иногда помочь, когда я озадачен StackOverflow! Еще раз спасибо! - person Leonardo Urbano; 25.08.2015