Помогите добавить MaxTradesPerBar в советник - страница 2

 
serpentsnoir:

megamixx,

Если вы все еще там, я могу предложить несколько изменений кода, которые сделают то, что вы ищете. Дайте мне знать, если вы все еще заинтересованы.

Затем перекомпилируйте код, чтобы убедиться, что он работает без ошибок. Дайте мне знать, когда у вас это получится, и я вставлю следующее изменение.

Получилось и успешно скомпилировалось спасибо sn.
 
megamixx:

Получил и успешно скомпилировал, спасибо sn.


Хорошо, отлично.

Далее находится блок кода следующего содержания

int openPositions()
{
//... blah...
}

скопируйте весь блок, вставьте его сразу после и переименуйте в OpenTradesOnThisCandle

Затем перекомпилируйте, чтобы убедиться, что все работает без ошибок.

Я сейчас ухожу на работу, так что вы не услышите меня раньше. Опубликуйте изменения, если вы застрянете.

 

Скопировал этот блок и переименовал его, теперь он выглядит следующим образом:

int OpenTradesOnThisCandle( )
{ int op =0;
for(int i=OrdersTotal()-1;i>=0;i--) // сканируем все ордера и позиции...
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() != MagicNumber) continue;
if ( OrderSymbol()==Symbol() )
{
if ( OrderType() == OP_BUY ) op++;
if ( OrderType() == OP_SELL ) op++;
}
}
return(op);
}

Надеюсь, я все сделал правильно. Я скомпилировал и не получил никаких ошибок, кроме предупреждения:

Function "OpenTradesOnThisCandle" is not referenced and will be removed from exp-file
0 error(s), 1 warning(s)

 

Хорошо. Это сообщение - всего лишь предупреждение, и оно скоро исчезнет.

Теперь измените строку, где вы видите MODE_TRADES на MODE_HISTORY в новой подпрограмме, которую вы создали.

Теперь замените оба оператора if с OrderType() на следующий.

if (OrderOpenTime() > Time[0]) op++;

Когда вы получите это (а вы получите то же предупреждение), скомпилируйте его, чтобы убедиться, что в нем нет ошибок.

 
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() != MagicNumber) continue;
if ( OrderSymbol()==Symbol() )
  1. Что такое возвращаемые значения функций? Как их использовать? - MQL4 форум
  2. Если в цикле есть вызовы сервера, то необходимо выполнить обратный отс чет И проверить коды возврата Циклы и закрытие или удаление ордеров - Форум MQL4
 

Вот как выглядит блок сейчас:

int OpenTradesOnThisCandle( )
{ int op =0;
for(int i=OrdersTotal()-1;i>=0;i--) // сканируем все ордера и позиции...
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderMagicNumber() != MagicNumber) continue;
if ( OrderSymbol()==Symbol() )
{
if (OrderOpenTime() > Time[0]) op++;
if (OrderOpenTime() > Time[0]) op++;
}
}
return(op);
}

Скомпилирован, 0 ошибок, 1 предупреждение

 

Привет, Мегамикс,

Я не читаю тему с самого начала, однако ...

1. Используйте кнопку SRC при размещении кода

2. Возврат OrderSelect() либо true, либо false, так что это правильный способ написания OrderSelect(),

int OpenTradesOnThisCandle( )
  { 
  int op =0;
  for(int i = OrdersTotal() - 1;i >= 0; i-- ) // scan all orders and positions...
    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == true   // if order select is true ...
        && OrderMagicNumber() != MagicNumber                  // ... and magic number is our magic number ...
        && OrderSymbol()      == Symbol() )                   // ... and symbol is chart symbol
        { 
        if (OrderOpenTime() > Time[0]) op++;             
        if (OrderOpenTime() > Time[0]) op++; 
        }
    } 
    return(op);
  }

:D

 
onewithzachy:

Привет, Мегамикс,

Я не читаю тему с самого начала, однако ...

1. Используйте кнопку SRC при размещении кода

2. Возврат OrderSelect() либо true, либо false, так что это правильный способ написания OrderSelect(),

:D


Спасибо за подсказку о размещении кода. Это имеет смысл. Что касается пункта #2, я буду полагаться на sn, так как он проводит меня через все шаги и я не хочу испортить его процесс. Большое спасибо!

 
megamixx:


Спасибо за подсказку о размещении кода. Это имеет смысл. Что касается пункта #2, я буду полагаться на sn, поскольку он проводит меня через все шаги и я не хочу испортить его процесс. Большое спасибо!


Мы пока будем действовать просто. onewithzacky прав, что проверка кодов возврата - хорошая привычка.

if (OrderOpenTime() > Time[0]) op++; <<== это должно быть только один раз. Так что уберите один.

Следующее, что нужно сделать, это найти этот код и продублировать его прямо под ним.

     if(TradesInThisSymbol > 0) 
     {
      return(0);
     }

Затем измените

(TradesInThisSymbol > 0)

на

(OpenTradesOnThisCandle() > MaxTradesPerCandle)
.

Затем скомпилируйте - ошибка должна исчезнуть.

 
serpentsnoir:


onewithzacky прав, проверка кодов возврата - хорошая привычка.

if (OrderOpenTime() > Time[0]) op++; <<== Это должно быть только один раз. Поэтому уберите один.

Следующее, что нужно сделать, это найти этот код и продублировать его прямо под ним.

Затем измените

(TradesInThisSymbol > 0)

на

(OpenTradesOnThisCandle() > MaxTradesPerCandle)

Затем скомпилируйте - ошибка должна исчезнуть.


Выполнено.

Удален дубликат if (OrderOpenTime() > Time[0]) op++;

нашел и изменил

(TradesInThisSymbol > 0)

на

(OpenTradesOnThisCandle() > MaxTradesPerCandle).

Большое спасибо за полезную помощь в этом вопросе.