Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну не надо уподобляться )))
Это немного не так работает. Задаются в качестве аргументов этой функции 1) строка, в которой нужно искать; 2) сочетание символов, что нужно найти; 3) Начало поиска (по умолчанию - с нулевого символа строки по п.1).
Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.
То есть писать надо так:
Спасибо за ответ ... вот оно что, оказывается функция 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? ...
Спасибо за ответ ... вот оно что, оказывается функция 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(); )
Спасибо за ответ ... вот оно что, оказывается функция 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-й ордер смотреть.
Вот про это уже сказали: double OrderTakeProfit() - не надо так делать. Эта функция объявляется автоматом и повторно её объявлять нельзя, да и компилятор ошибку выдаст, стандартные функции не нуждаются в предварительном объявлении.
if(OrderSelect(12, SELECT_BY_POS)==true) - если так сделать, то это в лучшем случае будет уже другой ордер, а не тот, для которого выше обрабатывался комментарий. Ордер уже должен быть выбран в самом начале, до if(StringFind(OrderComment(),"[tp]",0)>-1).
double OrderTakeProfit(); - тут ругаться по идее должен при компиляции.
На сколько я понимаю, (сам ещё разбираюсь пока) - OrderTakeProfit(); делает запрос профита ордера с площадки. Таким образом за эти несколько строк - эксперт делает 2 запроса OrderTakeProfit(); Похоже эту строчку просто удалить надо ( double OrderTakeProfit(); )
Вот про это уже сказали: 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? ...
Спасибо за ответ ... 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() и т.д.
Выглядеть это будет примерно так:
{
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());
}
}
}
Ещё раз. В работе с ордером на первом месте должен быть OrderSelect. Потом уже всё остальное.
они решили методом проб и ошибок по видимому, тока дорого встанет, сам прошёл через такое...
У меня уши вянут честно говоря...
скажите кто нить : как проверить наличие значения сигнала в том или ином буфере индикатора iCustom ?