Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 19

 
Vitalie Postolache:
Ну не надо уподобляться )))
причина не mql4
 
Vitalie Postolache:

Это немного не так работает. Задаются в качестве аргументов этой функции 1) строка, в которой нужно искать; 2) сочетание символов, что нужно найти; 3) Начало поиска (по умолчанию - с нулевого символа строки по п.1).

Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.

То есть  писать надо так:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

Спасибо за ответ ... вот оно что, оказывается функция StringFind со своими параметрами ( string string_value, string match_substring, int start_pos=0 ) записывается в общем коде одной строчкой с

аргументами соответствующими данным параметров функции: string OrderComment(), string "[tp]", int 0 и если это выражение (заключённое в круглые скобки) будет больше -1 , то выполняется следующий {заключённый в фигурные скобкиr} код:

 if(StringFind(OrderComment(),"[tp]",0)>-1

{

double  OrderTakeProfit(); 

  if(OrderSelect(12, SELECT_BY_POS)==true)

    Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

  else

    Print("OrderSelect() вернул ошибку - ",GetLastError());

bool  PlaySound(

   string  payment      // где "payment" имя файла в папке Sound МТ4

   );

}

 ... будет ли работать такой код в MQL4? ...

 
bablusut:

Спасибо за ответ ... вот оно что, оказывается функция StringFind со своими параметрами ( string string_value, string match_substring, int start_pos=0 ) записывается в общем коде одной строчкой с

аргументами соответствующими данным параметров функции: string OrderComment(), string "[tp]", int 0 и если это выражение (заключённое в круглые скобки) будет больше -1 , то выполняется следующий {заключённый в фигурные скобкиr} код:

 if(StringFind(OrderComment(),"[tp]",0)>-1

{

double  OrderTakeProfit(); 

  if(OrderSelect(12, SELECT_BY_POS)==true)

    Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

  else

    Print("OrderSelect() вернул ошибку - ",GetLastError());

bool  PlaySound(

   string  payment      // где "payment" имя файла в папке Sound МТ4

   );

}

 ... будет ли работать такой код в MQL4? ...

double  OrderTakeProfit();  - тут ругаться по идее должен при компиляции.

На сколько я понимаю, (сам ещё разбираюсь пока) - OrderTakeProfit(); делает запрос профита ордера с площадки. Таким образом за эти несколько строк - эксперт делает 2 запроса OrderTakeProfit(); Похоже эту строчку просто удалить надо ( double  OrderTakeProfit(); )

 
bablusut:

Спасибо за ответ ... вот оно что, оказывается функция StringFind со своими параметрами ( string string_value, string match_substring, int start_pos=0 ) записывается в общем коде одной строчкой с

аргументами соответствующими данным параметров функции: string OrderComment(), string "[tp]", int 0 и если это выражение (заключённое в круглые скобки) будет больше -1 , то выполняется следующий {заключённый в фигурные скобкиr} код:

 if(StringFind(OrderComment(),"[tp]",0)>-1

{

double  OrderTakeProfit(); 

  if(OrderSelect(12, SELECT_BY_POS)==true)

    Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

  else

    Print("OrderSelect() вернул ошибку - ",GetLastError());

bool  PlaySound(

   string  payment      // где "payment" имя файла в папке Sound МТ4

   );

}

 ... будет ли работать такой код в MQL4? ...

Вот про это уже сказали: double  OrderTakeProfit() - не надо так делать. Эта функция объявляется автоматом и повторно её объявлять нельзя, да и компилятор ошибку выдаст, стандартные функции не нуждаются в предварительном объявлении.

   if(OrderSelect(12, SELECT_BY_POS)==true) - если так сделать, то это в лучшем случае будет уже другой ордер, а не тот, для которого выше обрабатывался комментарий. Ордер уже должен быть выбран в самом начале, до  if(StringFind(OrderComment(),"[tp]",0)>-1) и как аргумент номера ордера нужно подставлять счётчик цикла, а не константу, а то так и будет каждую итерацию 12-й ордер смотреть.

 
Vitalie Postolache:

Вот про это уже сказали: double  OrderTakeProfit() - не надо так делать. Эта функция объявляется автоматом и повторно её объявлять нельзя, да и компилятор ошибку выдаст, стандартные функции не нуждаются в предварительном объявлении.

   if(OrderSelect(12, SELECT_BY_POS)==true) - если так сделать, то это в лучшем случае будет уже другой ордер, а не тот, для которого выше обрабатывался комментарий. Ордер уже должен быть выбран в самом начале, до  if(StringFind(OrderComment(),"[tp]",0)>-1).

A1exPit:

double  OrderTakeProfit();  - тут ругаться по идее должен при компиляции.

На сколько я понимаю, (сам ещё разбираюсь пока) - OrderTakeProfit(); делает запрос профита ордера с площадки. Таким образом за эти несколько строк - эксперт делает 2 запроса OrderTakeProfit(); Похоже эту строчку просто удалить надо ( double  OrderTakeProfit(); )

Спасибо за комментарий - Вы оказались правы.
 
"Vitalie Postolache:

Вот про это уже сказали: double  OrderTakeProfit() - не надо так делать. Эта функция объявляется автоматом и повторно её объявлять нельзя, да и компилятор ошибку выдаст, стандартные функции не нуждаются в предварительном объявлении.

   if(OrderSelect(12, SELECT_BY_POS)==true) - если так сделать, то это в лучшем случае будет уже другой ордер, а не тот, для которого выше обрабатывался комментарий. Ордер уже должен быть выбран в самом начале, до  if(StringFind(OrderComment(),"[tp]",0)>-1) и как аргумент номера ордера нужно подставлять счётчик цикла, а не константу, а то так и будет каждую итерацию 12-й ордер смотреть.

Спасибо за ответ ... c объявлением функции double  OrderTakeProfit() понятно, удаляем. 

 "... как аргумент номера ордера нужно подставлять счётчик цикла" - счётчик цикла у нас в предыдущем коде только один, в функции OrdersHistoryTotal  оператор циrла for с телом (i=0;i<accTotal;i++), значит следует тело оператора подставить вместо тела функции OrderSelect и у нас получится: 

  if(StringFind(OrderComment(),"[tp]",0)>-1

{

  if(OrderSelect(i=0;i<accTotal;i++)==true)

    Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

  else

    Print("OrderSelect() вернул ошибку - ",GetLastError());

bool  PlaySound(

   string  payment      // где "payment" имя файла в папке Sound МТ4

   );

}

 ... будет ли работать такой код в MQL4? ...




 
bablusut:

Спасибо за ответ ... c объявлением функции double  OrderTakeProfit() понятно, удаляем. 

 "... как аргумент номера ордера нужно подставлять счётчик цикла" - счётчик цикла у нас в предыдущем коде только один, в функции OrdersHistoryTotal  оператор циrла for с телом (i=0;i<accTotal;i++), значит следует тело оператора подставить вместо тела функции OrderSelect и у нас получится: 

Ещё раз.  В работе с ордером на первом месте должен быть OrderSelect. Потом уже всё остальное.

Если работаем в цикле перебора ордеров, то порядок действий такой:

1. Проверка if(OrderSelect())

2. Проверка, тот ли это ордер, обычно проверяют символ и магик, потом тип, если необходимо - if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - в данном случае обрабатываются только рыночные ордера, выставленные на текущем инструменте и с заданным магиком

3. Обработка других данных вроде OrderComment(), OrderProfit() и т.д. 

Выглядеть это будет примерно так:

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}


 

 
скажите кто нить : как проверить наличие значения сигнала в том или ином буфере индикатора iCustom ?
 
Vitalie Postolache:
Ещё раз.  В работе с ордером на первом месте должен быть OrderSelect. Потом уже всё остальное.

они решили методом проб и ошибок по видимому, тока дорого встанет, сам прошёл через такое...

У меня уши вянут честно говоря...

 
atik441:
скажите кто нить : как проверить наличие значения сигнала в том или ином буфере индикатора iCustom ?
по ссылке пройдите, она у Вас в посте выделена.
Причина обращения: