Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 46

 
Renat Akhtyamov:
int ticket;//тикет ордера
..........
ticket=OrderSend(.....);//приказ и запоминаем тикет ордера
if(ticket>0)//открылась
{
//действия с тикетом
}

Più preciso sarebbe:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Restituisce il numero di biglietto assegnato all'ordine dal server commerciale o -1 in caso di fallimento ."

Anche se anche nel tester il primo numero di biglietto è 1, non 0.

 
Oksana Berenko:

Più precisamente, lo sarà:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Restituisce il numero di biglietto assegnato all'ordine dal server commerciale o -1 in caso di fallimento ."

Anche se anche nel tester il primo numero di biglietto è 1, non 0.

Così felice di vedere la scomparsa di Oksana ))

Sì, i biglietti iniziano con 1 nel tester e sul server DC, ma non ne prenderete mai 1 in DC. La tua versione non funziona del tutto, non è corretto confrontare la disuguaglianza con -1. E se il conto reale restituisce 1234567?

if(ticket>0)//открылась
{
//действия с тикетом
}


// так верно
 

Così nel tester un biglietto non può essere meno di uno, ancora di più nel mondo reale

zero è inferiore a uno, entrambe le condizioni sono corrette, solo una per il confronto, l'altra per l'esclusione.

Anche se mi sono abituato a farlo:

// Открываем ордер
      int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,Comments,mn,0,BuyColor);
         if(ticketbuy<0)
         Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError());
         else
         Print(sy," OpenPosition. OrderSend Buy successfully");

Ma considerando il mio, le condizioni sono tutte corrette, solo la logica è diversa)

 
Buonasera, posso augurarvi un felice anno nuovo? Potreste dirmi cosa c'è di sbagliato in questo pezzo di codice?
void CloseOrder(int type)
  {
   bool ret;
   int error=0;
   double price=0.0;
   int total=OrdersTotal();
   if(!disabled(_Symbol))
     {
      Print(rezult);
      return;
     }
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderType()>1)continue;
      if(OrderType()!=type)continue;
      int digits=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
      if(OrderType()==OP_BUY)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
      if(OrderType()==OP_SELL)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);

      if(NormalizeDouble(NormalizePrice(OrderSymbol(),price),digits)!=price)continue;
      ret=OrderClose(OrderTicket(),OrderLots(),price,Slippage,clrLawnGreen);
      if(!ret)
        {
         error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType())," №- ",error," ",ErrorDescription(error));
         Print(rezult);
        }
      else
        {
         rezult=StringConcatenate(OrderSymbol(),": close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType()));
         Print(rezult);
        }

     }
  }
 
Movlat Baghiyev:
Potresti per favore dirmi cosa c'è di sbagliato in questo pezzo di codice?

Consiglio di cambiare la logica alla radice

Cioè è necessario tenere i registri degli ordini aperti - quante vendite e quanti baik sono aperti

E poi in base a queste considerazioni dovremmo gestire gli ordini - aprirli e chiuderli

 

Non so perché l'EA apre un sacco di ordini se la condizione non dovrebbe essere per l'apertura di una posizione, ma dopo l'apertura si apre di nuovo.

Non riesco a capire perché il mio EA apre molti ordini se non voglio che apra una posizione ma la riapre dopo che l'ho aperta, sospetto di avere qualcosa di sbagliato nel loop, non capisco bene i loop

for(int i=OrdersTotal()-1;i>=0;i--)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magico) // se la nostra magia

{

if(OrderType()==OP_BUY) sdel_b++; // conta bai

if(OrderType()==OP_SELL) sdel_s++; // Conta le vendite

if(OrderType()==OP_BUYSTOP) otl_b++; // Conta i bystops pendenti

if(OrderType()==OP_SELLSTOP) otl_s++; // Conta i sellstops pendenti

}


// ora ordini aperti

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Se è ora e non ci sono ordini pendenti

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //prendere una posizione

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

 
wishmast:

Non so perché l'EA apre un sacco di ordini se la condizione non dovrebbe essere per l'apertura di una posizione, ma dopo l'apertura si apre di nuovo.

Non riesco a capire perché il mio EA apre molti ordini se non voglio che apra una posizione ma la riapre dopo che l'ho aperta, sospetto di avere qualcosa di sbagliato nel loop, non capisco bene i loop

for(int i=OrdersTotal()-1;i>=0;i--)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magico) // se la nostra magia

{

if(OrderType()==OP_BUY) sdel_b++; // conta bai

if(OrderType()==OP_SELL) sdel_s++; // Conta le vendite

if(OrderType()==OP_BUYSTOP) otl_b++; // Conta i bystops pendenti

if(OrderType()==OP_SELLSTOP) otl_s++; // Conta i sellstops pendenti

}


// ora ordini aperti

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Se è ora e non ci sono ordini pendenti

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //prendere una posizione

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

Prova questo

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
 
Sergey Gritsay:

Prova questo

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
apre ancora un sacco di ordini
148Il numero di ordini aperti e in sospeso ha raggiunto il limite stabilito dal broker.
 
wishmast:
Apre ancora un sacco di ordini
148Il numero di ordini aperti e pendenti ha raggiunto il limite stabilito dal broker.
Per favore, mandaci tutto il codice, è difficile capire dove stai facendo un errore
 

Saluti. Buon anno a tutti!

Quando cerco di ottimizzare un EA dopo che è stato eseguito, i risultati e il grafico dell'ottimizzazione sono vuoti e il log è scritto nel registro:

Ci sono stati 2passaggifatti durante l'ottimizzazione, 2 risultati sono stati scartati come insignificanti

Deselezionare"algoritmo genetico" non aiuta. Capisco che i risultati sembrano insignificanti per il tester, ma come possiamo vedere cosa c'è? E questo nonostante il fatto che l'Expert Advisor non perde soldi per lo stesso periodo (un anno) durante i test, ma è +/- 20%.

Motivazione: