Открытие i+20 - страница 5

 

Так ли я описал временные  функции, а то на тесте дальше последней строчки не двигается?

int TimeSignal = 0;

 int TimeWaiting = TimeSignal + 3 * PeriodSeconds();

Если сигнал появился, то: TimeSignal = TimeSeconds(TimeLocal()); 

и ищем второй сигнал: TimeSeconds(TimeLocal()) >= (TimeSignal + 3 * PeriodSeconds())

 

Помогите с могофикацией.

Есть 2 ветки. Бычья и медвежья.

Нужно после открытия ордера  по рынку установить стоп и профит.

Знаю что ордер селект использавать надо. Но что конкретно не знаю.

 
kstar1:

Так ли я описал временные  функции, а то на тесте дальше последней строчки не двигается?

int TimeSignal = 0;

 int TimeWaiting = TimeSignal + 3 * PeriodSeconds();

Если сигнал появился, то: TimeSignal = TimeSeconds(TimeLocal()); 

и ищем второй сигнал: TimeSeconds(TimeLocal()) >= (TimeSignal + 3 * PeriodSeconds())

  Зачем TimeSeconds() применяете? Кроме того в этой функции разве можно сравнение писать? Может  if(TimeLocal()) >= TimeWaiting )?

И чтобы позанудствовать, тип данных datetime надо применять для работы с временем вместо int, он тоже целочисленный, но всё же.

 Можно и так примерно написать:

datetime TimeSignal=0, TimeWaiting=0;
int counter=0; //счетчик сигналов

if(signal && counter==0) {TimeSignal=TimeLocal(); TimeWaiting = TimeSignal + 3 * PeriodSeconds(); counter++;}

if(signal && counter>0) 
  if(TimeLocal()) >= TimeWaiting) {if(trade success) {counter=0;  TimeSignal=0; TimeWaiting=0;}}
 
EugenioKP1983:

Помогите с могофикацией.

Есть 2 ветки. Бычья и медвежья.

Нужно после открытия ордера  по рынку установить стоп и профит.

Знаю что ордер селект использавать надо. Но что конкретно не знаю.

В цикле перебрать все ордера, сначала OrderSelect() а потом если СЛ и-или ТП нулевые, то OrderModify(). Вот тут обсуждалось, может ещё где-то на форуме.

 
EugenioKP1983:

Помогите с могофикацией.

Есть 2 ветки. Бычья и медвежья.

Нужно после открытия ордера  по рынку установить стоп и профит.

Знаю что ордер селект использавать надо. Но что конкретно не знаю.


Вообще-то "после открытия ордера" означает, что функция OrderSend только что вернула Вам номер тикета вновь открытой сделки.

Если Вы в OrderSend указали ненулевые SL и TP, то можно сделать селект по номеру тикета и проверить, вдруг SL и TP уже установлены как надо. В этом случае вызов OrderModify с такими же значениями даст ошибку, что неприятно.

Если в OrderSend были заданы нули, проверять незачем. Сразу OrderModify с полученным номером тикета.

 
evillive:

В цикле перебрать все ордера, сначала 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 то не факт что сработает так как отдача от сервера может повлиять и советник получит ещо не открытую позициу.


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



Как лучше посоветуйте

 
EugenioKP1983:

ТО что нужно.


Не пойму, зачем перебирать все ордера, если номер тикета нужного ордера уже известен. Объясните?
 
Vlad143:
Не пойму, зачем перебирать все ордера, если номер тикета нужного ордера уже известен. Объясните?Согласен можно и по тикету
 
evillive:

  Зачем TimeSeconds() применяете? Кроме того в этой функции разве можно сравнение писать? Может  if(TimeLocal()) >= TimeWaiting )?

И чтобы позанудствовать, тип данных datetime надо применять для работы с временем вместо int, он тоже целочисленный, но всё же.

 Можно и так примерно написать:

 

if не стал писать, думал понятно, что это проверка условия.
Почему занудство? Я и не знал, что к PeriodSeconds (он же вроде int), прибавлять datetime можно. Компилятор выдал предупреждение , вот я и стал к int все приводить. Убрал TimeSeconds и все заработало. Только советник теперь ордера открывает по истечении трех баров, хотя оба сигнала образовались еще на "первом". Понятно, что я где-то логику нарушил, но и писал её лишбы запустить. 
У меня другой вопрос. Я выше писал логику своей ТС. Если я поиск первого сигнала делаю так:
if (Signal_1 || Signal_2 == buy)
то как мне для поиска второго сигнала, который только один изних, определить какой из них сработал, чтобы проверять уже другой?
Надеюсь, понятно написал))
Или придется каждую пару отдельно проверять?



Причина обращения: