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

 
Vyacheslav Kornev:

Grazie per l'aiuto, ma nel trading reale non fa differenza come prendere il prezzo? Dopo tutto, devi mettere sia l'indicatore che l'EA sul grafico?

Nel trading reale sarete in grado di ottenere i dati. Finché non si cancellano accidentalmente le linee dell'indicatore...

 
Artyom Trishkin:

Con uno vero potrete ricevere dati. Se non si rimuovono accidentalmente le linee dell'indicatore...


Allora, ho un'altra domanda: ho un EA fantastico. Ma ha bisogno di fare questo: quando attraversa una linea, si apre un ordine addizionale in questa direzione, e poi si chiude sul profitto... Come fare in modo che dopo la chiusura in profitto, l'ordine addizionale non venga aperto di nuovo? Fino a quando la linea dell'indicatore non viene aggiornata?

//==================Impostazione di un ordine aggiuntivo ============
doppio Lotti2;
if((PriceHigh>PriceLow && Ask>PriceHigh && LBUY<LSELL)|| (PriceLow>PriceHigh && Ask>PriceLow && LBUY<LSELL) )
 

Buon pomeriggio, ho bisogno di un piccolo aiuto con il codice che:

apre BUY se il file 11112222.txt contiene 1;

apre SELL se il file 11112222.txt contiene -1;

chiude tutti gli ordini se il file 11112222.txt contiene 0;


Dato il file 11112222.txt, ci possono essere solo tre voci: 1, -1 o 0


Non capisco cosa c'è di sbagliato in questo codice; per qualche ragione, se vedo 0 nel file 11112222.txt, apre l'ordine BUY, invece del codice dell'ordine chiuso, non so proprio cosa ci sia di sbagliato.

Ay, c'è anche un problema, quando l'EA è in esecuzione, è quasi sempre impossibile aprire 11112222.txt, dice che il file è occupato da un'altra applicazione, quindi per risolvere questo problema ho messo FileClose(handle2); // Chiudi file di testo; ma non aiuta e ho bisogno che l'EA controlli il file 11112222.txt per 1, -1 o 0 dopo che è stato aperto e poi lo chiuda, perché il file viene periodicamente utilizzato da un altro programma per mettere 1, -1 o 0.

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек:

Buon pomeriggio, ho bisogno di un piccolo aiuto con il codice che:

apre BUY se il file 11112222.txt contiene 1;

apre SELL se il file 11112222.txt contiene -1;

chiude tutti gli ordini se il file 11112222.txt contiene 0;


Il file 11112222.txt è dato e può avere solo tre voci: 1, -1 o 0.


Per qualche motivo, quando 0 è nel file 11112222.txt, apre un ordine BUY, mentre dovrebbe scattare un codice di ordine close; non capisco quale sia l'errore.

Allora, c'è anche un problema, quando l'EA è in esecuzione, è quasi sempre impossibile aprire 11112222.txt, perché dice che il file è occupato da un'altra applicazione. Per risolvere il problema, ho messo FileClose(handle2); // Chiudi file di testo; ma non funziona e ho bisogno che l'EA controlli il file 11112222.txt per 1, -1 o 0, poi lo chiuda, perché ogni secondo un altro programma usa questo file per metterci 1, -1 o 0.

Perché l'handle del file non è il contenuto del file.

Dovete prima leggere il contenuto del file, e solo dopo impostare la condizione. È il contrario, hai una condizione per handle, poi leggi il file e lo chiudi.

 
Alexey Viktorov:

Perché l'handle del file non è il contenuto del file.

Dovete prima leggere il contenuto del file, e solo dopo mettere la condizione. Nel vostro caso è viceversa, condizione per handle, poi leggere il file e chiuderlo.

1) - Questa parte apre il file 11112222.txt per leggere i dati da esso:

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - Poi viene la condizione se handle2>0


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3) - Questa è la parte che non capisco:


       Print(FileReadString(handle2));

4) - Questa parte chiude il file:


       FileClose(handle2); // закрытие текстового файла

5) - Poiché la condizione handle2>0 è soddisfatta, cioè il file 11112222.txt contiene 1, apre un ordine di acquisto:

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

Quali parti ho confuso?
 

Saluti cercando di scrivere uno script per chiudere gli ordini.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   bool reasult;
   for (int i = OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS)>0)
      {
         if (OrderSymbol() != Symbol())
            continue;
         
         switch (OrderType())
         {
            case OP_BUY  :
               reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
               if (!reasult) Print ("Ошибка закрытия ордера на покупку", GetLastError());
               break;
            case OP_SELL :
               reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
               if (!reasult) Print ("Ошибка закрытия ордера на продажу", GetLastError());
               break;
         }   
         
      }
   }
}

Se apro diversi ordini di vendita e di acquisto alternativamente e provo a chiuderli con questo ordine, solo alcuni vengono chiusi, il resto ottiene l'errore 129 (prezzo errato).

Ho provato a fare uno script che per esempio fa 10 tentativi * sul numero di ordini, con pausa in caso di errore.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ 
   int c=CountTrades()*10;
   
   for ( int a=1 ; a<=c; a++)
   {
   if (CountTrades()==0) { Print ("Orders are successfully closed! Break."); break;}
    Print("Try ", a, " out of ", c);
      
      bool reasult;
      for (int i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol()) 
            
            {      
            
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }              
            }   
            
         }
      }Sleep(1000);
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol())
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 count++;
        }
    }
    
    return(count);
}

Di solito riesce a svolgere il suo compito dopo un certo numero di tentativi, ai quali viene emesso lo stesso errore 129. Ma mentre cerca, con molti tentativi, di chiudere gli ordini fuori può essere chiuso manualmente, e questo non causa errori, si chiudono.

Cosa sto facendo di sbagliato?

 
Andrey Sokolov:

Saluti cercando di scrivere uno script per chiudere gli ordini.

Se apro diversi ordini di vendita e di acquisto alternativamente e provo a chiuderli con questo ordine, solo alcuni vengono chiusi, il resto ottiene l'errore 129 (prezzo errato).

Ho provato a fare uno script che per esempio fa 10 tentativi * sul numero di ordini, con pausa in caso di errore.

Di solito riesce a svolgere il suo compito dopo un certo numero di tentativi, ai quali viene emesso lo stesso errore 129. Ma mentre cerca, con molti tentativi, di chiudere gli ordini fuori può essere chiuso manualmente, e questo non causa errori, si chiudono.

Cosa sto facendo di sbagliato?

            RefreshRates(); // Попробуйте добавить
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }  

In generale, quello che scrivi non è permesso di fare trading su un conto reale, è solo per un tester

 
Vitaly Muzichenko:

In generale, quello che scrivi non dovrebbe essere permesso di commerciare in un conto reale, è solo per il tester

            RefreshRates(); // Попробуйте добавить

Aiuta, grazie.

 
Vitaly Muzichenko:

In generale, quello che scrivi non è permesso di fare trading su un conto reale, è solo per un tester


Può spiegare perché "non è permesso commerciare..."?

 
Andrey Sokolov:

Può spiegare perché "non è permesso commerciare"?

Non c'è alcun controllo degli errori, e se il server si chiude e genera un errore critico, l'Expert Advisor continuerà comunque a martellare il server, e questo puzza di divieto per ulteriore auto-trading.

Motivazione: