Ваши вопросы по языку MQL4

vladradon

Программист
Инит отрабатывает только в момент запуска/перезапуска сова и если его не трогать - функция инит не будет запускаться, а значит и ограничение не сработает. Поэтому я написал, что нужно в OnTick() вставлять - она отрабатывает по каждому тику.
 

Slava78

Элитный участник
Инит отрабатывает только в момент запуска/перезапуска сова и если его не трогать - функция инит не будет запускаться, а значит и ограничение не сработает. Поэтому я написал, что нужно в OnTick() вставлять - она отрабатывает по каждому тику.
Так правильно, ваша строчка почему-то не компилируется?
 

Вложения

  • Screenshot_29.png
    Screenshot_29.png
    5,3 КБ · Просмотры: 17

AlexeNP

Гуру форума
Если вставлять в инит, то можно запустить сова на год на VPS и забыть и он без перезагрузки так и будет пахать.;)
ну, если душа просит чего-нибудь хорошего, то можно)
PHP:
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(TrailingStop>0)
      Trailing();
   if(CloseSig>0)
      ClosePos();
   if(t!=Time[0])
     {
      if(CountTrades()<1)
         OpenPos();
      t=Time[0];
     }
   if(FindOrderType()==0 && (FindLastBuyPrice()-Ask)/Point>=Step)
     {
      if(Trial()==true)
         PutOrder(0,Ask);
      ModifyOrders();
     }

   if(FindOrderType()==1 && (Bid-FindLastSellPrice())/Point>=Step)
     {
      if(Trial()==true)
         PutOrder(1,Bid);
      ModifyOrders();
     }
   Comment("\n Lot: ",Lot(),
           "\n Profit: ",AllProfit(),
           "\n Trades: ",CountTrades());
  }
//+------------------------------------------------------------------+
bool Trial()
  {
//---
   datetime trial=D'31.01.2020';
   if(TimeCurrent()>trial)
     {
      Print("Свободу роботам!");
      return(false);
     }
   return(true);
//---
  }
//+------------------------------------------------------------------+
 

Slava78

Элитный участник
ну, если душа просит чего-нибудь хорошего, то можно)
PHP:
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(TrailingStop>0)
      Trailing();
   if(CloseSig>0)
      ClosePos();
   if(t!=Time[0])
     {
      if(CountTrades()<1)
         OpenPos();
      t=Time[0];
     }
   if(FindOrderType()==0 && (FindLastBuyPrice()-Ask)/Point>=Step)
     {
      if(Trial()==true)
         PutOrder(0,Ask);
      ModifyOrders();
     }

   if(FindOrderType()==1 && (Bid-FindLastSellPrice())/Point>=Step)
     {
      if(Trial()==true)
         PutOrder(1,Bid);
      ModifyOrders();
     }
   Comment("\n Lot: ",Lot(),
           "\n Profit: ",AllProfit(),
           "\n Trades: ",CountTrades());
  }
//+------------------------------------------------------------------+
bool Trial()
  {
//---
   datetime trial=D'31.01.2020';
   if(TimeCurrent()>trial)
     {
      Print("Свободу роботам!");
      return(false);
     }
   return(true);
//---
  }
//+------------------------------------------------------------------+
Большое спасибо
 

AlexeNP

Гуру форума
А зачем создавать отдельную функцию с дополнительной переменной, если вся проверка умещается в одну строку без доп переменных? ;) :)
что-то мне подсказывает, что одним триалом дело не кончится... сначала триал, потом демо, потом номер счета... потом - есть ли жизнь на Марсе)
 

freshwind

Новичок форума
добрый день,
подскажите что не так с куском кода. При тестировании на натуральной истории, которую терминал сам подтягивает у брокера, сов открывает 1 сделку, функция ордерселект ордер выделяет (ticket=1), ordermodify постоянно выдает ошибку 130 (неправильные стопы). Я уже все что мог в принты вывел. Стоп и тейк являются ценой удаленной от действующей больше чем стоплевел. У брокера 5-знак, я уже прописывал и 5-ти и 4-х знак, умножал все 10. Перепробовал несколько вариаций кода, не помогает...

SLnorm=NormalizeDouble(Ask + SL,5);
TPnorm=NormalizeDouble(Bid - TP,5);
ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,5),slippage,0,0,comment,magic,0,clrNONE);
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{ // 10
Print(" ticket= ",ticket," Ask= ",Ask," Bid= ",Bid," OrderOpenPrice= ",OrderOpenPrice()," spread= ",MarketInfo(Symbol(),MODE_SPREAD));

bool modify=OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SLnorm1,Digits),NormalizeDouble(TPnorm1,Digits),0,Blue);
if (!modify)
Print(" OrderModify ERROR ",GetLastError()," SLnorm= ",SLnorm," TPnorm= ",TPnorm," Ask= ",Ask," Bid= ",Bid," ticket= ",ticket," Point= ",Point," Digits= ",Digits);
else
return;

} // 10
 

vladradon

Программист
выдает ошибку 130 (неправильные стопы)
Для ордера бай стоплосс вычитаем из цены открытия, а тейкпрофит прибавляем - у Вас наоборот.
И еще, если SL и TP заданы в пунктах, их нужно привести к ценам графика:
SLnorm=NormalizeDouble(Ask - SL*_Point,_Digits);
TPnorm=NormalizeDouble(Bid + TP*_Point,_Digits);
 
Последнее редактирование:

MrGreen86

Гуру форума
поменял, теперь постоянно ошибка ordermodify 1
вы бы целиком код показали. так как вы новичек, ошибка скорее всего будет не там где вы ищите. ошибка 1 это не ошибка, это сообщение о том что ошибки нет, но результат не получен от брокера. Вероятно вы пытаетесь выставить СЛ и ТП ордеру точно такие же как уже стоят.
 

vladradon

Программист
поменял, теперь постоянно ошибка ordermodify 1
Перед модификацией вставьте проверку на наличие таких стопов и тейков, которые собираетесь установить:
if(OrderStopLoss()==NormalizeDouble(SLnorm1,Digits) && OrderTakeProfit()==NormalizeDouble(TPnorm1,Digits)) return;
bool modify=OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SLnorm1,Digits),NormalizeDouble(TPnorm1,Digits),0,Blue);
 
  • Like
Реакции: Ugar

elgaza

Новичок форума
Hello, I'm trying to encode an indicator so that when changing the timeframe or applying the template
He will apply "CHART_END" or show me the last candle on the screen, without the need
click the end or end chart button
Thanks so much for your time and advice.
 

freshwind

Новичок форума
всем доброго дня и еще более приятного вечера :)

подскажите правильно ли прописать алгоритм (если работает условие 1 и 2 или 1 и 3 или 1 и 4) таким образом:

if(условие 1 && условие 2 || условие 3 || условие 4)

то есть, если сработают условия 1 и 2 дальше рассмотр уже не идет.
 
Верх