как исправить код ? Чтобы в рынке был один ордер,а не куча.

 

Может кто нибудь потратит своё драгоценное время и поможет поправить код. СПАСИБО.

#include <stdlib.mqh>         // errors library


extern int       TakeProfit_Buy = 30;
extern int       TakeProfit_Sell = 30;
extern int       StopLoss_Buy = 200;
extern int       StopLoss_Sell = 200;
extern int       TrailingStop = 5;
extern double    Lots = 0.01;
extern int       per_MA1 = 50;
extern int       per_MA2 = 80;
extern int       per_MA3 = 150;
extern int       shift_MA1 = 0;
extern int       shift_MA2 = 0;
extern int       shift_MA3 =0
extern int       revers = 1;
extern int MA1_method = 0;
extern int MA2_method = 0;
extern int MA3_method = 0;
extern int MA1_price = 0;
extern int MA2_price = 0;
extern int MA3_price = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
if (Volume[0] > 1) return(0);
//----
// Объявляем переменные
int total, cnt, Buy=0, Sell=0;
double MA1,  MA2,MA3 ,MA1p;
int err;

// Вычисляем начальные параметры индикаторов для поиска условий входа

  MA1 = iMA(NULL,0,per_MA1, shift_MA1, MA1_method,MA1_price,0);
  MA1p= iMA(NULL,0,per_MA1, shift_MA1, MA1_method,MA1_price,2);
  MA2 = iMA(NULL,0,per_MA2, shift_MA2, MA2_method,MA2_price,0);
  MA3 = iMA(NULL,0,per_MA3, shift_MA3, MA3_method,MA3_price,0);
  // проверим, есть ли ранее открытые позиции или ордеры?
    total=OrdersTotal();

  //  закрываем открытые сделки при наступлении подходящих условий
  for(cnt=total-1;cnt>=0;cnt--)
     {
       
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if((OrderType()==OP_BUY  && revers==0) || (OrderType()==OP_SELL && revers==1) ) 
         {
           if( (MA2-MA1)>=0.0001 && MA1p>MA2)// условие СЕЛЛ (не учитываем Ма3)
             {
                 //OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
             }
           if(TrailingStop>0)  
               {                 
                if(Bid-OrderOpenPrice()>Point*TrailingStop) // Bid - цена покупки
                  {
                   if(OrderStopLoss()<Bid-Point*(TrailingStop+5))
                     {
                      OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                      return(0);
                     }
                  }
               }
            }
       if((OrderType()==OP_SELL && revers==0) || (OrderType()==OP_BUY && revers==1) ) 
         {
           if( (MA1-MA2)>=0.0001 && MA1p<MA2)// условие БАЙ (не учитываем Ма3)
             {
                //OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
             }
           if(TrailingStop>0)  
             {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))  // Ask - цена продажи
                 {
                   if((OrderStopLoss()>(Ask+Point*(TrailingStop+5))) || (OrderStopLoss()==0))
                     {
                       OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                       return(0);
                     }
                 }
             }
         }
     }
//----     
  // Проверка средств
  if(AccountFreeMargin()<(300*Lots))
     {
       Print("We have no money. Free Margin = ", AccountFreeMargin());   
       return(0);  
     }
  // Проверка условий для открытия ордеров
  if((MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==0) ||      // условие БАЙ
     (MA1<MA3 && (MA2-MA1)>=0.0001 && MA1p>MA2 && revers==1) )       // условие СЕЛЛ
    {
            Print("BUY MA1 = ",MA1 ," MA2 = ", MA2 ," MA1p = ",MA1p);
            if(OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss_Buy*Point,Ask+TakeProfit_Buy *Point,"Покупаем",16384,0,Green)<0)
            {Print("Oшибка: ",ErrorDescription(GetLastError()),", Цена= ",Ask);}
     }

  if((MA1<MA3 && (MA2-MA1)>=0.0001 && MA1p>MA2 && revers==0) ||      // условие СЕЛЛ
     (MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==1) )       // условие БАЙ
     {
            Print("SELL MA1 = ",MA1 ," MA2 = ", MA2," MA1p = ",MA1p);
            if(OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss_Sell *Point,Bid-TakeProfit_Sell *Point,"Продаем",16385,0,Red)<0)
            {Print("Oшибка: ",ErrorDescription(GetLastError()),", Цена= ",Bid);}
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Замени

if((MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==0) || // условие БАЙ
на

if(OrdersTotal()==0&&(MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==0) || // условие БАЙ

 

Флаги нужны (bool FLAG=true или false):

- открытие SELL

- открытие BUY

- закрытие SELL

- закрытие BUY

В общем - 4 штуки. При выполнении операции - переключать. Тогда всё заблокируется как Вам нужно.

 
Roger:

Замени

if((MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==0) || // условие БАЙ
на

if(OrdersTotal()==0&&(MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==0) || // условие БАЙ


Привет. Поменяла строки . БАЙ ордер теперь один в рынке так как надо, а СЕЛЛ по прежнему много ордеров. посмотрите пожалуйста что надо исправить?
 
rusa:

Привет. Поменяла строки . БАЙ ордер теперь один в рынке так как надо, а СЕЛЛ по прежнему много ордеров. посмотрите пожалуйста что надо исправить?


аналогично для селла :)

добавте в условие для села OrdersTotal()==0

 
rusa:


// Проверка условий для открытия ордеров
if(OrdersTotal()==0&&(MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==0) || // условие БАЙ
OrdersTotal()==0&&(MA1<MA3 && (MA2-MA1)>=0.0001 && MA1p>MA2 && revers==1) ) // условие СЕЛЛ

селл открывает очень много .


 

Неправильно поменяли, надо было во втором выражении добавить условие:

if(OrdersTotal()==0&&(MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==0) ||      // условие БАЙ
     (MA1<MA3 && (MA2-MA1)>=0.0001 && MA1p>MA2 && revers==1) )       // условие СЕЛЛ
    {
            Print("BUY MA1 = ",MA1 ," MA2 = ", MA2 ," MA1p = ",MA1p);
            if(OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss_Buy*Point,Ask+TakeProfit_Buy *Point,"Покупаем",16384,0,Green)<0)
            {Print("Oшибка: ",ErrorDescription(GetLastError()),", Цена= ",Ask);}
     }

  if(OrdersTotal()==0&&(MA1<MA3 && (MA2-MA1)>=0.0001 && MA1p>MA2 && revers==0) ||      // условие СЕЛЛ
     (MA1>MA3 && (MA1-MA2)>=0.0001 && MA1p<MA2 && revers==1) )       // условие БАЙ
 
Roger:

Неправильно поменяли, надо было во втором выражении добавить условие:


Спасибо.Всё работает отлично.
Причина обращения: