помогите мне пожалуйста [решено]

 

Я новичок в mql4 и этот код открывает несколько ордеров, как я могу избежать этого? Он должен открывать только один ордер до его закрытия,

как я могу это сделать?

Спасибо

void OnTick()
  {

  
  double up= iIchimoku (NULL, 5,9,26,52,3,0);
  double down= iIchimoku (NULL,5,9,26,52,4,0);

  
  if (MathMin (up,down) < Bid )
  

  OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
    
    
  }
  
 
void OnTick()
  {

  if(OrdersTotal()==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
    }
    
  }
 
Спасибо большое, сэр, вы были строги к делу, не посылали меня по кругу.
 

Это решение, но это не лучшее решение, как вы узнаете, если продолжите.

Но оно может помочь вам в данный момент.

 
Marco vd Heijden:

Это решение, но это не лучшее решение, как вы узнаете, если продолжите.

Но оно может помочь вам на данный момент.

да, это решило проблему в теме, но когда он закрывается, он также создает новый ордер, если он все еще выше облака. Не могли бы вы помочь мне решить эту новую проблему?

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

 

Вы можете создать флаг.

bool order=0;


Затем вы можете установить значение в единицу, когда заказ размещен.

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
     order=1;
    }
    
  }

Но это даст вам предупреждение, что вам нужно проверить возвращаемое значение функции ordersend.

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     int ticket=OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if(ticket!=-1)
        {
         order=1;
        }
      }
    }
  }

Почему бы не установить флаг в зависимости от того, был ли заказ успешно размещен или нет?

В этом случае, если ваш ордер не удался, он продолжит попытку.

 
mrluck1:

да, это решило проблему в теме, но когда он закрывается, он также создает новый ордер, если он все еще выше облака. Не могли бы вы помочь мне решить эту новую проблему?

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

Как уже намекнул Марко, вы, вероятно, столкнетесь с другими проблемами.

Что если есть открытый ордер на другом символе?

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

Что если есть отложенные ордера?

Что если триггер все еще активен, когда вы закрываете первый?

В ответ на последний вопрос вы можете использовать флаг, как предложил Марко. Только помните, что вам нужно решить, когда сбросить флаг, иначе советник больше никогда не совершит ни одной сделки.

В качестве альтернативы можно проверить пересечение / изменение состояния с ниже/в облаке на выше облака.

 

я поставил ваш код и он говорит, что билет не раскрыт, поэтому я объявил его, но теперь код открывает несколько заказов, как и раньше, как теперь действовать?

void OnTick()
  {

bool order= 0;
int ticket;

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    int ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket!=1)
        {
         order=1;
        }
      }
    }
  }


И для честного пса: В этом примере это скрипт, так что только 1 сделка - это нормально.
 
mrluck1:

я поставил ваш код и он говорит, что билет не раскрыт, поэтому я объявил его, но теперь код открывает несколько заказов, как и раньше, как теперь действовать?

void OnTick()
  {

bool order= 0;
int ticket;

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    int ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket!=1)
        {
         order=1;
        }
      }
    }
  }


Возможно, вам будет полезно почитать об области видимости переменных.

Что происходит со значением ордера каждый тик?

 

Итак, вы объявляете билет с флагом boolean.

bool order=0;
int ticket;

А затем

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket>0)
        {
         order=1;
        }
      }
    }
  }

Вы не можете объявить их в OnTick(), потому что их значение будет сбрасываться при каждом тике.

Также обратите внимание, что OrderSend либо возвращает номер билета, либо -1 минус один в случае неудачи.

 

Я поставил

bool заказ и

int ticket

на глобальные переменные, а остальной код на OnTick, но все равно не делает никаких записей теперь