Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1967

 
Valeriy Yastremskiy #:

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

Не подскажу
 

Всех приветствую! Прошу помочь с изменением данного кода. Это советник открывающий ордера по сигналам индикатора. В данном виде кода, советник может открывать одновременно и на buy, и на sell. Как сделать так что-бы был открыт только один тип ордеров - т.е. если сигнал на buy от индюка - открываем ордер на BUY. Если индюк даёт сигнал на sell - закрыаем BUY и открываем ордер на SELL. Что изменить в коде, помогите плиз.

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 500;      // язь
extern int Slip         = 30;       // реквот
extern int Shift        = 1;        // сдвиг
extern int Magic        = 123;      // магик

extern string IndName   = "#STS_alert_mail_2008";
extern int MAMetod      = 3;
extern int MAPeriod     = 11;

bool b=true,s=true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int    r=0;
   double sl=0,tp=0;
//--- get Ind
   double FBlue=iCustom(NULL,0,IndName,MAMetod,MAPeriod,4,Shift);
   double FRed=iCustom(NULL,0,IndName,MAMetod,MAPeriod,5,Shift);
//--- sell conditions
   if(FRed<1000 && s)
     {
      if(StopLoss>0) sl=NormalizeDouble(Bid+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(Bid-TakeProfit*Point,Digits);
      r=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),Slip,sl,tp,"",Magic,0,Red);
      if(LastDealResult()==1)
        {
         b=true;
         s=false;
        }
     }
//--- buy conditions
   if(FBlue<1000 && b)
     {
      if(StopLoss>0) sl=NormalizeDouble(Ask-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);
      r=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),Slip,sl,tp,"",Magic,0,Blue);
      if(LastDealResult()==1)
        {
         b=false;
         s=true;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;

   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
         if(OrderProfit()<0)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double FBlue=iCustom(NULL,0,IndName,MAMetod,MAPeriod,4,Shift);
   double FRed=iCustom(NULL,0,IndName,MAMetod,MAPeriod,5,Shift);

   if(CountTrades()<1) OpenPos();

   Comment("\n Blue: ",FBlue,
           "\n Red: ",FRed);
//---
  }
//+------------------------------------------------------------------+
 
Artis98 #:

Всех приветствую! Прошу помочь с изменением данного кода. Это советник открывающий ордера по сигналам индикатора. В данном виде кода, советник может открывать одновременно и на buy, и на sell. Как сделать так что-бы был открыт только один тип ордеров - т.е. если сигнал на buy от индюка - открываем ордер на BUY. Если индюк даёт сигнал на sell - закрыаем BUY и открываем ордер на SELL. Что изменить в коде, помогите плиз.

У тебя самого что именно не получается?

 
Andrei Sokolov #:

У тебя самого что именно не получается?

Не знаю как сделать две вещи. Во-первых, сделать так что-бы при появлении сигнала от индикатора (стрелочку на графике рисует) - открывался ордер в соотвествующую сторону (buy, к примеру). Если при появлении сигнала уже открыт ордер в другую сторону (sell) - тогда надо сначала закрыть sell, а потом уже открыть buy. И второе, что-бы при появлении сигнала от индюка, не сразу входил, а выжидал n-ое кол-во свеч, т.к. быает что сигнал поступил и продержался всего ничего. Такие "ложные" сигналы лучше отфильтрововать как-то. Собственно это всё

 
Касательно первого, насколько я понял, отвечает данный блок
int CountTrades()

Он считает ордеры, но что и как изменить надо - не разобрался

 
Artis98 #:

Не знаю как сделать две вещи. Во-первых, сделать так что-бы при появлении сигнала от индикатора (стрелочку на графике рисует) - открывался ордер в соотвествующую сторону (buy, к примеру). Если при появлении сигнала уже открыт ордер в другую сторону (sell) - тогда надо сначала закрыть sell, а потом уже открыть buy. И второе, что-бы при появлении сигнала от индюка, не сразу входил, а выжидал n-ое кол-во свеч, т.к. быает что сигнал поступил и продержался всего ничего. Такие "ложные" сигналы лучше отфильтрововать как-то. Собственно это всё

1 :

если(сигнал покупки)

{

закрыть продажи;

открыть покупку;

}

2 : параметру сдвиг в источнике задайте нужное количество свечей.

 
Artis98 #:

индюка

индикатора

 
Andrei Sokolov #:

1 :

если(сигнал покупки)

{

закрыть продажи;

открыть покупку;

}

2 : параметру сдвиг в источнике задайте нужное количество свечей.

А в каком блоке это прописать - в 

int CountTrades()

или в 

void OpenPos()

?

 
Artis98 #:

А в каком блоке это прописать - в или в  ?

OnTick
 
Andrei Sokolov #:

Я попробовал добавить, вот что вышло

//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double FBlue=iCustom(NULL,0,IndName,MAMetod,MAPeriod,4,Shift);
   double FRed=iCustom(NULL,0,IndName,MAMetod,MAPeriod,5,Shift);

   if(CountTrades()<1) OpenPos();
   
  int total = OrdersTotal();
   for (int i = 0; i < total; i++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic)) {
         return(0);
      } 
   }

   Comment("\n Blue: ",FBlue,
           "\n Red: ",FRed);
//---
  }
//+------------------------------------------------------------------+

Ничего не изменилось. Что не так сделал?

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