Нужно после открытия ордера по рынку установить стоп и профит.
Знаю что ордер селект использавать надо. Но что конкретно не знаю.
В цикле перебрать все ордера, сначала OrderSelect() а потом если СЛ и-или ТП нулевые, то OrderModify(). Вот тут обсуждалось, может ещё где-то на форуме.
Нужно после открытия ордера по рынку установить стоп и профит.
Знаю что ордер селект использавать надо. Но что конкретно не знаю.
Вообще-то "после открытия ордера" означает, что функция OrderSend только что вернула Вам номер тикета вновь открытой сделки.
Если Вы в OrderSend указали ненулевые SL и TP, то можно сделать селект по номеру тикета и проверить, вдруг SL и TP уже установлены как надо. В этом случае вызов OrderModify с такими же значениями даст ошибку, что неприятно.
Если в OrderSend были заданы нули, проверять незачем. Сразу OrderModify с полученным номером тикета.
В цикле перебрать все ордера, сначала OrderSelect() а потом если СЛ и-или ТП нулевые, то OrderModify(). Вот тут обсуждалось, может ещё где-то на форуме.
Значения для расчета у меня даны все раз в цикл так как уже при следующем перещете
zero_BE и TP_Multiplayer_Buy и SL_Multiplayer_Buy уже получают другое значение.
Вывод
Если сразу в коде после открытия ордера вставить функцию По OrderModify то не факт что сработает так как отдача от сервера может повлиять и советник получит ещо не открытую позициу.
if(OrdersTotal()!=0)//проверка наличия открытых ордеровfor(int i =0; i <OrdersTotal(); i++)//ищем последний открытый ордерif(OrderSelect(i, SELECT_BY_POS))if(OrderMagicNumber()== magic &&OrderStopLoss()==0&&OrderTakeProfit()==0)//если используется магик{if(OrderType()==OP_BUY){// расчет стопа и профита для длинных поз }else{// расчет стопа и профита для коротких поз}OrderModify(OrderTicket(),0, stoploss, takeprofit,0);//модификация ордераif(GetLastError()==0)Print("Уровень стоп-лосс и тейк-профит модифицированы: ","стоп-лосс: ", stoploss,"тейк-профит: ", takeprofit);}
Выход1. Поставить Паузу - если такая функция есть.Между оформлением позы и модификацией
Выход 2. Записать normalizaTP и normalizeSL в Глобальные переменные и уже после перещета оперируя с ними устанавливать стоп и тейк от OrderOpenPrice. Что в сути намного лучше и чище нежели от Свечи 1
Зачем TimeSeconds() применяете? Кроме того в этой функции разве можно сравнение писать? Может if(TimeLocal()) >= TimeWaiting )?
И чтобы позанудствовать, тип данных datetime надо применять для работы с временем вместо int, он тоже целочисленный, но всё же.
Можно и так примерно написать:
if не стал писать, думал понятно, что это проверка условия.
Почему занудство? Я и не знал, что к PeriodSeconds (он же вроде int), прибавлять datetime можно. Компилятор выдал предупреждение , вот я и стал к int все приводить. Убрал TimeSeconds и все заработало. Только советник теперь ордера открывает по истечении трех баров, хотя оба сигнала образовались еще на "первом". Понятно, что я где-то логику нарушил, но и писал её лишбы запустить.
У меня другой вопрос. Я выше писал логику своей ТС. Если я поиск первого сигнала делаю так:
if (Signal_1 || Signal_2 == buy)
то как мне для поиска второго сигнала, который только один изних, определить какой из них сработал, чтобы проверять уже другой?
Так ли я описал временные функции, а то на тесте дальше последней строчки не двигается?
int TimeSignal = 0;
int TimeWaiting = TimeSignal + 3 * PeriodSeconds();
Если сигнал появился, то: TimeSignal = TimeSeconds(TimeLocal());
и ищем второй сигнал: TimeSeconds(TimeLocal()) >= (TimeSignal + 3 * PeriodSeconds())
Помогите с могофикацией.
Есть 2 ветки. Бычья и медвежья.
Нужно после открытия ордера по рынку установить стоп и профит.
Знаю что ордер селект использавать надо. Но что конкретно не знаю.
Так ли я описал временные функции, а то на тесте дальше последней строчки не двигается?
int TimeSignal = 0;
int TimeWaiting = TimeSignal + 3 * PeriodSeconds();
Если сигнал появился, то: TimeSignal = TimeSeconds(TimeLocal());
и ищем второй сигнал: TimeSeconds(TimeLocal()) >= (TimeSignal + 3 * PeriodSeconds())
Зачем TimeSeconds() применяете? Кроме того в этой функции разве можно сравнение писать? Может if(TimeLocal()) >= TimeWaiting )?
И чтобы позанудствовать, тип данных datetime надо применять для работы с временем вместо int, он тоже целочисленный, но всё же.
Можно и так примерно написать:
Помогите с могофикацией.
Есть 2 ветки. Бычья и медвежья.
Нужно после открытия ордера по рынку установить стоп и профит.
Знаю что ордер селект использавать надо. Но что конкретно не знаю.
В цикле перебрать все ордера, сначала OrderSelect() а потом если СЛ и-или ТП нулевые, то OrderModify(). Вот тут обсуждалось, может ещё где-то на форуме.
Помогите с могофикацией.
Есть 2 ветки. Бычья и медвежья.
Нужно после открытия ордера по рынку установить стоп и профит.
Знаю что ордер селект использавать надо. Но что конкретно не знаю.
Вообще-то "после открытия ордера" означает, что функция OrderSend только что вернула Вам номер тикета вновь открытой сделки.
Если Вы в OrderSend указали ненулевые SL и TP, то можно сделать селект по номеру тикета и проверить, вдруг SL и TP уже установлены как надо. В этом случае вызов OrderModify с такими же значениями даст ошибку, что неприятно.
Если в OrderSend были заданы нули, проверять незачем. Сразу OrderModify с полученным номером тикета.
В цикле перебрать все ордера, сначала OrderSelect() а потом если СЛ и-или ТП нулевые, то OrderModify(). Вот тут обсуждалось, может ещё где-то на форуме.
ТО что нужно.
А вот теперь реальная задача.
Сейчас вхожу в рынок по Аску и тейк отщитываю от 1 свечи
Вот Пример
normalizaTP = NormalizeDouble(Low[1] +(((int)zero_BE)*TP_Multiplayer_Buy)*_Point,5);/*PriceOpen_Buy Профит фактор 1/ к 3**/
normalizeSL = NormalizeDouble(Low[1] -((((int)zero_BE)*SL_Multiplayer_Buy)/2)*_Point,5);
RefreshRates();
ticketBuy = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,normalizeSL,normalizaTP,"",Magic,0,clrGreen);
Значения для расчета у меня даны все раз в цикл так как уже при следующем перещете
zero_BE и TP_Multiplayer_Buy и SL_Multiplayer_Buy уже получают другое значение.
Вывод
Если сразу в коде после открытия ордера вставить функцию По OrderModify то не факт что сработает так как отдача от сервера может повлиять и советник получит ещо не открытую позициу.
Выход1. Поставить Паузу - если такая функция есть.Между оформлением позы и модификацией
Выход 2. Записать normalizaTP и normalizeSL в Глобальные переменные и уже после перещета оперируя с ними устанавливать стоп и тейк от OrderOpenPrice. Что в сути намного лучше и чище нежели от Свечи 1
Как лучше посоветуйте
ТО что нужно.
Не пойму, зачем перебирать все ордера, если номер тикета нужного ордера уже известен. Объясните?Согласен можно и по тикету
Зачем TimeSeconds() применяете? Кроме того в этой функции разве можно сравнение писать? Может if(TimeLocal()) >= TimeWaiting )?
И чтобы позанудствовать, тип данных datetime надо применять для работы с временем вместо int, он тоже целочисленный, но всё же.
Можно и так примерно написать: