Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 39

 
trader781:
Non so come spiegarlo. Ma è sicuramente un capolavoro.
Ti dico che qui amano essere sarcastici). Trishkin si è offeso e ha detto che avrebbe avuto un codice per aiutare.
 
Movlat Baghiyev:
Ti dico che a loro piace essere sarcastici qui ))) Anche Trishkin si è offeso e ha detto che il codice aiuterà.

Sono nuovo come te, ma anche io ho un sacco di domande

for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!=Magic) continua;
if(OrderType()==OP_BUY||OrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
else b++;
if(OrderType()==OP_SELLSTOP)
if(signal_sell)OrderDelete(OrderTicket());
else s++;
}

}

1) dove hai preso b++

2) dove hai presos++

3)if(signal_bue) è cos'altro?

E il resto del codice. Scusa se ti ho offeso.

 
Probabilmente è il modo giusto per farlo.
//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if (TrailingStop!=0) Trailing();
  
   //ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
  
   int b = 0, s = 0, p = 0, res = 0;

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
   for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        if (OrderType()==OP_BUYSTOP)
        {
           if(RSI0<50&&RSI1>50)
                OrderDelete(OrderTicket());
            else
                b++;
        }
        if (OrderType()==OP_SELLSTOP)
        {
           if(RSI0>50&&RSI1<50)
                OrderDelete(OrderTicket());
              else
                s++;
        }
      }
    }

   double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить

//---- buy stop
   if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----
   return(0);
}
 
Movlat Baghiyev:
Ti dico che qui amano essere sarcastici). E Trishkin si è offeso e ha detto che mi avrebbe aiutato con il codice.

Così è più semplice:

void OrderDelete_(int Type)
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            OrderDelete(OrderTicket());
        }
     }
  }

È da qualche parte al di fuori della funzione void OnTick().

if (сигнал_bue) OrderDelete_(OP_SELLSTOP);

if (сигнал_sell)OrderDelete_(OP_BUYSTOP);

E questo è nel corpo della funzione void OnTick().

 
Alekseu Fedotov:


E questo è nel corpo della funzione void OnTick()

Si prega di fare le correzioni nel codice
 
trader781:

Ok.

Più o meno ho finito quello che potevo. La descrizione è fatta. Lo scopo è quello di capire perché non funziona come vorrei.

C'è qualcos'altro all'interno del blocco if(). Era davvero previsto in questo modo?

Più in là. La funzione Counts() accetta una variabile globale non inizializzata count che, inoltre, è definita ancora una volta all'interno della funzione.

La funzione Counts() conta gli ordini ma li confronta con qualche biglietto che cambia più volte nella funzione principale. Ma il valore del biglietto è lo stesso durante il funzionamento della funzione. Quindi, quanti ordini calcolerà la funzione? È più di uno?

In questa forma, questa funzione non ha bisogno di argomenti, basta chiamarla e farle restituire il risultato.

Il prossimo. La funzione FindLastOType() è di nuovo un confronto con il biglietto. Può garantire che è confrontato con un biglietto valido? Non è più semplice interrompere il ciclo quando viene trovato il primo ordine con il numero magico e il simbolo necessari e poi restituire il tipo di ordine?

Lo stesso vale per FindLastOrderOpenPrice() e FindLastLot().

La funzione ModifyOrders() mi ha fatto inorridire così tanto che non la guarderei per molto tempo per dormire senza incubi...

 
Movlat Baghiyev:
Si prega di fare le correzioni nel codice

Prova ^_~

extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  int  res = 0;

//ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
//---- buy stop
   if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----  
  
  
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);

if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);

  }

//+------------------------------------------------------------------+
void OrderDelete_(int Type)
  {
  bool  r;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
          r = OrderDelete(OrderTicket());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
  {
  int kp=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            kp++;
        }
     }
  return(kp);  
  }
//+------------------------------------------------------------------+
 
Alekseu Fedotov, grazie, Dio ti benedica.
 
Vitalie Postolache:

C'è qualcos'altro all'interno del blocco if(). Era davvero destino che fosse così?

Più in là. La funzione Counts() accetta una variabile globale non inizializzata count che è anche dichiarata ancora una volta nella funzione stessa.

La funzione Counts() conta gli ordini ma li confronta con qualche biglietto che cambia più volte nella funzione principale. Ma il valore del biglietto è lo stesso durante il funzionamento della funzione. Quindi, quanti ordini calcolerà la funzione? È più di uno?

In questa forma, questa funzione non ha bisogno di argomenti, basta chiamarla e farle restituire il risultato.

Il prossimo. La funzione FindLastOType() è di nuovo un confronto con il biglietto. Può garantire che è confrontato con un biglietto valido? Non è più semplice interrompere il ciclo quando viene trovato il primo ordine con il numero magico e il simbolo necessari e poi restituire il tipo di ordine?

Lo stesso vale per FindLastOrderOpenPrice() e FindLastLot().

La funzione ModifyOrders() mi ha terrorizzato così tanto che non l'ho guardata per molto tempo per evitare incubi notturni...

Correzione

Non c'è altro modo di metterlo da nessun'altra parte, sarebbe un parametro sbagliato

Deve prendere in considerazione il più recente

Cercherò di cambiarlo.

Ho provato a usare OrderModify() standard, ma si blocca se muovo un mucchio di ordini simultaneamente e costantemente

Grazie per la critica.

 
spoiltboy:
Sì, la parentesi è sbagliata. Il resto della domanda è valido.

bool condition;

if(condition) {}

equivalente a

if(condition==true) {}

и

if(!condition) {}

è uguale a

if(condition==false) {}

È solo più breve e più familiare.

Motivazione: