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

vladradon

Программист
Большое спасибо! Сегодня попробую!
Все-таки допустил неточность:
PHP:
void BuyPendingOrder43()
  {
   int ticket=0;
   int stoplevel=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
   double price = NormalizeDouble(Close[1]+PriceOffset1*PipValue*_Point,NDigits);
   double SL=NormalizeDouble(price-StopLoss1*PipValue*_Point,NDigits);
   if(StopLoss1==0) SL=0.0;
   double TP=NormalizeDouble(price+Takeprofit1*PipValue*_Point,NDigits);
   if(Takeprofit1==0) TP=0.0;
   if(stoplevel>0)
     {
      if(SL>0.0 && ((int)(MathAbs(SL-Ask)/_Point)<=stoplevel ||
        (int)(MathAbs(SL-Bid)/_Point)<=stoplevel ||
        (int)(MathAbs(SL-price)/_Point)<=stoplevel)) {Print("Error StopLoss"); return;}
      if(TP>0.0 && ((int)(MathAbs(TP-Ask)/_Point)<=stoplevel ||
        (int)(MathAbs(TP-Bid)/_Point)<=stoplevel ||
        (int)(MathAbs(TP-price)/_Point)<=stoplevel)) {Print("Error TakeProfit"); return;}
      for(int cnt=0; cnt<OrdersTotal(); cnt++)
         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol)
            if((price>0.0 && ((int)(MathAbs(OrderOpenPrice()-price)/_Point)<=stoplevel ||
               (int)(MathAbs(OrderTakeProfit()-price)/_Point)<=stoplevel ||
               (int)(MathAbs(OrderStopLoss()-price)/_Point)<=stoplevel)) ||
               (TP>0.0  && ((int)(MathAbs(OrderOpenPrice()-TP)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-TP)/_Point)<=stoplevel ||
               (int)(MathAbs(OrderStopLoss()-TP)/_Point)<=stoplevel)) ||
               (SL>0.0 && ((int)(MathAbs(OrderOpenPrice()-SL)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-SL)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderStopLoss()-SL)/_Point)<=stoplevel)))
           {Print("Error cross other orders"); return;}
      }
   if(price>Ask+stoplevel*_Point) ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots1,price,4,SL,TP,"My Expert",1,Blue);
   if(ticket==-1) Print("OrderSend() error - ",ErrorDescription(GetLastError()));
 }
А для селовских отложек последнюю проверку нужно так прописать:
PHP:
if(price<Bid-stoplevel*_Point) ticket=OrderSend(.....
Но эти последние проверки только для стоповых отложек. Для лимитных проверки для бай и селл меняются местами.
 
Последнее редактирование:

Walt6730

Новичок форума
Проверьте, пожалуйста, правильно я написал для SELLSTOP?
void SellPendingOrder73()
{
int ticket=0;
int stoplevel=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
double price = NormalizeDouble(Bid-PriceOffset2*PipValue*_Point,NDigits);
double SL=NormalizeDouble(price+StopLoss2*PipValue*_Point,NDigits);
if(StopLoss2==0) SL=0.0;
double TP=NormalizeDouble(price-Takeprofit2*PipValue*_Point,NDigits);
if(Takeprofit2==0) TP=0.0;
if(stoplevel>0)
{
if(SL>0.0 && ((int)(MathAbs(SL+Ask)/_Point)<=stoplevel || (int)(MathAbs(SL+Bid)/_Point)<=stoplevel)) {Print("Error StopLoss"); return;}
if(TP>0.0 && ((int)(MathAbs(TP+Ask)/_Point)<=stoplevel || (int)(MathAbs(TP+Bid)/_Point)<=stoplevel)) {Print("Error TakeProfit"); return;}
for(int cnt=0; cnt<OrdersTotal(); cnt++)
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol)
if((price>0.0 && ((int)(MathAbs(OrderOpenPrice()+price)/_Point)<=stoplevel ||
(int)(MathAbs(OrderTakeProfit()+price)/_Point)<=stoplevel ||
(int)(MathAbs(OrderStopLoss()+price)/_Point)<=stoplevel)) ||
(TP>0.0 && ((int)(MathAbs(OrderOpenPrice()+TP)/_Point)<=stoplevel ||
(int)(MathAbs(OrderTakeProfit()+TP)/_Point)<=stoplevel ||
(int)(MathAbs(OrderStopLoss()+TP)/_Point)<=stoplevel)) ||
(SL>0.0 && ((int)(MathAbs(OrderOpenPrice()+SL)/_Point)<=stoplevel ||
(int)(MathAbs(OrderTakeProfit()+SL)/_Point)<=stoplevel ||
(int)(MathAbs(OrderStopLoss()+SL)/_Point)<=stoplevel)))
{Print("Error cross other orders"); return;}
}
if(price>Bid-stoplevel*_Point) ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots2,price,4,SL,TP,"My Expert",1, Red);
if(ticket==-1) Print("OrderSend() error - ",ErrorDescription(GetLastError()));
}
 

vladradon

Программист
Проверьте, пожалуйста, правильно я написал для SELLSTOP?
Я там добавил еще пару проверок выше и в селловской последней проверке знак меньше if(price<Bid-stoplevel*_Point) :
PHP:
void BuyPendingOrder43()
  {
   int ticket=0;
   int stoplevel=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
   double price = NormalizeDouble(Close[1]+PriceOffset1*PipValue*_Point,NDigits);
   double SL=NormalizeDouble(price-StopLoss1*PipValue*_Point,NDigits);
   if(StopLoss1==0) SL=0.0;
   double TP=NormalizeDouble(price+Takeprofit1*PipValue*_Point,NDigits);
   if(Takeprofit1==0) TP=0.0;
   if(stoplevel>0)
     {
      if(SL>0.0 && ((int)(MathAbs(SL-Ask)/_Point)<=stoplevel || 
         (int)(MathAbs(SL-Bid)/_Point)<=stoplevel || 
         (int)(MathAbs(SL-price)/_Point)<=stoplevel)) {Print("Error StopLoss"); return;}
      if(TP>0.0 && ((int)(MathAbs(TP-Ask)/_Point)<=stoplevel || 
         (int)(MathAbs(TP-Bid)/_Point)<=stoplevel || 
         (int)(MathAbs(TP-price)/_Point)<=stoplevel)) {Print("Error TakeProfit"); return;}
      for(int cnt=0; cnt<OrdersTotal(); cnt++)
         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol)
            if((price>0.0 && ((int)(MathAbs(OrderOpenPrice()-price)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-price)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderStopLoss()-price)/_Point)<=stoplevel)) || 
               (TP>0.0 && ((int)(MathAbs(OrderOpenPrice()-TP)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-TP)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderStopLoss()-TP)/_Point)<=stoplevel)) || 
               (SL>0.0 && ((int)(MathAbs(OrderOpenPrice()-SL)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-SL)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderStopLoss()-SL)/_Point)<=stoplevel)))
            {Print("Error cross other orders"); return;}
     }
   if(price>Ask+stoplevel*_Point) ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots1,price,4,SL,TP,"My Expert",1,Blue);
   if(ticket==-1) Print("OrderSend() error - ",ErrorDescription(GetLastError()));
  }
//+------------------------------------------------------------------+
void SellPendingOrder73()
  {
   int ticket=0;
   int stoplevel=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
   double price = NormalizeDouble(Bid-PriceOffset2*PipValue*_Point,NDigits);
   double SL=NormalizeDouble(price+StopLoss2*PipValue*_Point,NDigits);
   if(StopLoss2==0) SL=0.0;
   double TP=NormalizeDouble(price-Takeprofit2*PipValue*_Point,NDigits);
   if(Takeprofit2==0) TP=0.0;
   if(stoplevel>0)
     {
      if(SL>0.0 && ((int)(MathAbs(SL-Ask)/_Point)<=stoplevel || 
         (int)(MathAbs(SL-Bid)/_Point)<=stoplevel || 
         (int)(MathAbs(SL-price)/_Point)<=stoplevel)) {Print("Error StopLoss"); return;}
      if(TP>0.0 && ((int)(MathAbs(TP-Ask)/_Point)<=stoplevel || 
         (int)(MathAbs(TP-Bid)/_Point)<=stoplevel || 
         (int)(MathAbs(TP-price)/_Point)<=stoplevel)) {Print("Error TakeProfit"); return;}
      for(int cnt=0; cnt<OrdersTotal(); cnt++)
         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol)
            if((price>0.0 && ((int)(MathAbs(OrderOpenPrice()-price)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-price)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderStopLoss()-price)/_Point)<=stoplevel)) || 
               (TP>0.0 && ((int)(MathAbs(OrderOpenPrice()-TP)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-TP)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderStopLoss()-TP)/_Point)<=stoplevel)) || 
               (SL>0.0 && ((int)(MathAbs(OrderOpenPrice()-SL)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderTakeProfit()-SL)/_Point)<=stoplevel || 
               (int)(MathAbs(OrderStopLoss()-SL)/_Point)<=stoplevel)))
            {Print("Error cross other orders"); return;}
     }
   if(price<Bid-stoplevel*_Point) ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots2,price,4,SL,TP,"My Expert",1,Red);
   if(ticket==-1) Print("OrderSend() error - ",ErrorDescription(GetLastError()));
  }
Только в селловской функции прайс считается от бида, а не от цены закрытия 1-го бара, как в баевской. Так и надо?
 
Последнее редактирование:

Walt6730

Новичок форума
Но вот мне все равно не понятно: сначала все ведь работало. Никаких ошибок не было. А потом вдруг перестало работать, хоть я ничего в советнике не менял. Это брокер то-то химичит?
 

vladradon

Программист
Но вот мне все равно не понятно: сначала все ведь работало. Никаких ошибок не было. А потом вдруг перестало работать, хоть я ничего в советнике не менял. Это брокер то-то химичит?
Не знаю. Нужно номер ошибки еще знать. Брокер на реале может иногда включать разные ограничения на выставление ордеров. А в некоторых случаях (это может случиться на больших скачках цены при выходе новостей или при входе в рынок крупного капитала) цена может тупо перескочить цену отложки и отложка не сработает и по каждому тику будет выдаваться ошибка от сервера (такое было на реале на фьючерсах) и в итоге приходилось дублировать отложку рыночным ордером, а отложку срочно удалять.
 
Последнее редактирование:

Walt6730

Новичок форума
Только в селловской функции прайс считается от бида, а не от цены закрытия 1-го бара, как в баевской. Так и надо?

Скомпилировал, кинул на график. Теперь пишет вот это:

SuperTrend AUDUSD,M5: indicator is too slow, 2875 ms. rewrite the indicator, please
 

Walt6730

Новичок форума
Это он пишет про индикатор, что он слишком медленный и просит его перезаписать.

Ну это я понял. Раньше не писала такого. Это после Вашего кода? Причем у меня в советнике этот индикатор используется на разных таймфреймах, а пишет только про 5-минутку.
 

vladradon

Программист
Ну это я понял. Раньше не писала такого. Это после Вашего кода? Причем у меня в советнике этот индикатор используется на разных таймфреймах, а пишет только про 5-минутку.
А в моем коде разве есть обращение к индикатору?:D Там только проверки.
 

vladradon

Программист
Ну так я про это и говорю. Может, это и есть результат проверки? А если попробовать другого брокера? Поможет?
Они никак между собой не связаны! Покажи мне строчки обращения к индикатору лучше. Или стукни мне в скайп (ник тот же) и в онлайне сейчас все разберем по-быстрому.
 

Walt6730

Новичок форума
Они никак между собой не связаны! Покажи мне строчки обращения к индикатору лучше. Или стукни мне в скайп (ник тот же) и в онлайне сейчас все разберем по-быстрому.

Ну типа так на бай:

void TechnicalAnalysis2x76()
{
if ((iCustom(NULL, PERIOD_M5, "SuperTrend",10,1.4,0,1) != EMPTY_VALUE) && (Ask <= iMA(NULL, PERIOD_M5,10,2,MODE_SMMA,PRICE_CLOSE,0)))
{
Exist32();
DoNotExist30();

}
}
 

vladradon

Программист
Ну типа так на бай:
У индикатора 2 входных параметра? Если да, то вроде все правильно. Я скачал какой-то супертренд в нете, но у него нет параметров и он легкий по коду. Тогда только сам индикатор нужно смотреть - он же тормозит, а не сов. Если просто индикатор на график закинуть, он не тормозит?
 

Walt6730

Новичок форума
Если просто индикатор на график закинуть, он не тормозит?

В том-то и дело. Я этим индюком давным-давно пользуюсь (пришпиливаю, кстати), и это первый раз, когда сов выдает такую фигню. Опять же, когда я запустил его пару дней назад, - никаких проблем не было!
 

Вложения

  • SuperTrend.mq4
    4,2 КБ · Просмотры: 21

vladradon

Программист
В том-то и дело. Я этим индюком давным-давно пользуюсь (пришпиливаю, кстати), и это первый раз, когда сов выдает такую фигню. Опять же, когда я запустил его пару дней назад, - никаких проблем не было!
Пробовал его по всякому - нет тормозов. Просто ввел пару строк в сова и переключал ТФ.
PHP:
double x=0;
   if ((x=iCustom(NULL, PERIOD_M5, "SuperTrend",10,1.4,0,1)) != EMPTY_VALUE) Alert("SuperTrend = ",x);
Может его перекомпилировать.
А это вообще сов выдает или на самом графике запущен индикатор. По сообщению вроде это сам терминал выдает работу индикатора медленной и он при каждом тике это пишет о медленности или один раз выскочило?
 
Последнее редактирование:

vladradon

Программист
Опять же, когда я запустил его пару дней назад, - никаких проблем не было!
У меня сов больше полугода нормально работал, пока ТП не совпал со стопуровнем и из-за ненормализованности данных из терминала по количеству знаков после запятой, переключалка на виртуальный режим перестала срабатывать. Пришлось часть кода переписывать. Так что глюки могут совсем не сразу и очень неожиданно появиться.
 
Верх