[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 325

 
sergeev:

перед попыткой закрытия выполнить OrderSelect и проверить OrderCloseTime. Если оно уже больше 0, то ордер закрыт.


У меня есть Select, a OrderCloseTime где поставить? После Селекта или в функции CloseOrder()?

Посмотрел в Доке. У меня Селекта по истории нет, только по Траде. Значит попробую поставить этот Селект по истории после условия закрытия и перед CloseOrder(). Спасибо!

 
Внутри селекта, после фильтров на символ и магик (если они есть), то есть проверяем ордер на время закрытия, если оно не равно нулю (ордер закрыт), то запрещаем повторное его закрытие
 
FAQ:
Внутри селекта, после фильтров на символ и магик (если они есть), то есть проверяем ордер на время закрытия, если оно не равно нулю (ордер закрыт), то запрещаем повторное его закрытие


Спасибо! Значит, попробую выше!

Вот, попытался вставить, прогнал в демо, но что-то выходят больше ошибок и разных. Прошу сначала, от печки, по этому коду из Доки:

  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime ctm=OrderOpenTime();
     int      ticket=OrderTicket();
     if(ctm>0) Print("Время открытия ордера № ",ticket," ",ctm);
     ctm=OrderCloseTime();
     if(ctm>0) Print("Время закрытия ордера № ",ticket," ",ctm);
    }
  else
    Print("OrderSelect() вернул ошибку ",GetLastError());

Что здесь лишнее, чтобы вставить между Селектом Траде, проверки по символу, магику... и ... типом ордера. Может, datetime cmt и int ticket представить в начале старта? А принт пишет другие ошибки.

И добавить условие для закрытия:

if(ctm == 0) {CloseOrder(OrderTicket(),OrderLots(),Bid,slip,Yellow);return(0);} else continue;

Помогите, пожалуйста!

 

Здарова, подскажите пожалста

Требуется открывать ордер не сразу с тп и сл, а ставить тп и сл после открытия ордера его модифицированием

сделал так:

ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen);
{
OrderSelect(ticket,SELECT_BY_TICKET);
}
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Blue);
return(0);

}


нихрена не понимаю что и зачем

правильно?

 
RMX13:

Здарова, подскажите пожалста

Требуется открывать ордер не сразу с тп и сл, а ставить тп и сл после открытия ордера его модифицированием

сделал так:

ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen);
{
OrderSelect(ticket,SELECT_BY_TICKET);
}
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Blue);
return(0);

}


нихрена не понимаю что и зачем

правильно?



И я не понимаю и больше! Пользуйся SRC для изложения кода, видишь наверху?
 
int orderOpen(int cmd, double open, int stopLossPips, int takeProfitPips, int magicNumber){       
      double sl=0, tp=0;
      if(stopLossPips>0){
         stopLossPips = MathMax(stopLossPips,MarketInfo(Symbol(),MODE_STOPLEVEL)+3*_pipsMultiplyer);
      }
      if(takeProfitPips>0){
         takeProfitPips = MathMax(takeProfitPips,MarketInfo(Symbol(),MODE_STOPLEVEL)+3*_pipsMultiplyer);
      }
      int ticket=-1;
      if(_doTrade){        
         double lots  = OrderLotSize();
         if(lots>=MarketInfo(Symbol(), MODE_MINLOT)){          
            //wait context
            if(TradeIsBusy() < 0) {
                 return(-1); 
            }
            if(cmd==OP_BUYSTOP || cmd==OP_BUY || cmd==OP_SELLLIMIT){
               RefreshRates();
               if(cmd==OP_BUY){
                  open=Ask;
               }
               if(stopLossPips>0){
                  sl=NormalizeDouble(open-stopLossPips*Point,Digits);
               }
               if(takeProfitPips>0){
                  tp=NormalizeDouble(open+takeProfitPips*Point,Digits);
               }
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,sl,tp,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen);              
            }else{
               RefreshRates();
               if(cmd==OP_SELL){
                  open=Bid;
               }
               if(stopLossPips>0){
                  sl=NormalizeDouble(open+stopLossPips*Point,Digits);
               }
               if(takeProfitPips>0){
                  tp=NormalizeDouble(open-takeProfitPips*Point,Digits);
               }
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,sl,tp,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,Red);
            }
Для начала, этот кусок отвечает за открытие ордера?
 
все сам догадался
 
borilunad:


Спасибо! Значит, попробую выше!

Вот, попытался вставить, прогнал в демо, но что-то выходят больше ошибок и разных. Прошу сначала, от печки, по этому коду из Доки:

Что здесь лишнее, чтобы вставить между Селектом Траде, проверки по символу, магику... и ... типом ордера. Может, datetime cmt и int ticket представить в начале старта? А принт пишет другие ошибки.

И добавить условие для закрытия:

Помогите, пожалуйста!


Эээх, как говорится : "учись студент" (с)

for(int i=OrdersTotal()-1;i>=0;i--){
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES){
      if(OrderSymbol()!=Symbol()){continue;}// фильтр по символу(если не наш символ, то пропускаем)
      if(OrderMagicNumber()!=magik){continue;}// фильтр по магику
      if(OrderCloseTime()!=0){continue;}// фильтр по времени закрытия (если не=0 то ордер уже закрыт)
      if(OrderType()<=OP_SELL){//закрытие для рыночных ордеров
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
      }else{// закрытие для отложенных ордеров
         OrderDelete(OrderTicket());
      }
   }
}

ненужное вычеркнуть (закомментировать)

 
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,Red);
            OrderSelect(ticket,SELECT_BY_TICKET);
            OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0);

Кусок кода открывающий ордер и ставящий стоп лосс и тейк профит

терминал выдает ошибки: EURUSD,M30: OrderSend error 130

EURUSD,M30: invalid ticket for OrderModify function

EURUSD,M30: OrderModify error 4051

EURUSD,M30: OrderSend failed with error #4051 bid:1.23674000 ask:1.23683000 Open:1.23674000 SL:1.2423 TP:1.2283 MODE_STOPLEVEL:0.00000000 LOT:0.01000000

В чем проблема можете подсказать?


 
FAQ:


Эээх, как говорится : "учись студент" (с)

ненужное вычеркнуть (закомментировать)


Спасибо большое! Я и учусь всю жизнь! И вообще, учиться интереснее, чем работать. Сейчас попробую приспособить, очень не хочется менять порядка в коде. В любой момент меняю или добавляю условия в зависимости от изменений в поведении рынка. Всего Вам доброго и спокойной ночи!
Причина обращения: