Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 829

 
In mt5, quando testate su tick reali, la commissione conta lì, o solo lo spread?
 

L'esperto di valute multiple nel ciclo chiede i dati per simbolo. C'è un tale frammento:

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

Tutti i simboli passano normalmente. Durante il primo passaggio il tempo è di circa 120ms, perché i buffer degli indicatori si riempiono. A partire dal secondo passaggio il tempo di calcolo sulla barra corrente è inferiore a 1 ms.

La particolarità è che un noto broker ha il simbolo EURRUR, per il quale non ci sono dati ("Wait for update"). Quindi il calcolo è bloccato su questa linea per 51 secondi. Errore 4806. 51 secondi è inaccettabile anche per una (prima) volta, figuriamoci per un ciclo.

Domanda. Come posso scoprire rapidamente che non ci sono dati per un dato personaggio? Poi lo memorizzavo e nelle iterazioni successive ci passavo sopra e andavo avanti senza perdere il ritmo.

 

Colleghi, per favore consigliate come convertire un array di tipo double in stringa. Ho bisogno di scriverlo in un file. Ecco un codice di formazione generale.

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

Informazioni prese dall'articolo

Salvare e caricare array da un file

Quando salviamo e carichiamo un array da un file, dobbiamo considerare la differenza tra la prima dimensione della dimensione dell'array e il numero totale dei suoi elementi. Quando salvate un array, dovreste prima scrivere la dimensione dell'array (il numero totale di elementi determinato da ArraySize()) nel file, poi l'intero array:

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

Ciao, sto affrontando il seguente problema.

Ho due EAs per lo stesso strumento con diversi magiks rispettivamente. Ho impostato il mio magik attraverso CTrade e ho aperto una posizione anche attraverso CTrade. Quando ho una posizione aperta del primo EA, il suo magik è assegnato al secondo EA (l'ho controllato dopo aver aperto una posizione, vedi sotto), quindi il controllo delle posizioni aperte non vede il mio magik e apro molte posizioni in una direzione. Il conto è su una demo, questo non può essere rilevato nel tester. Se il valore del magik è salvato nella classe, forse dovrebbe essere azzerato, ma non so come.

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

Ciao, sto affrontando il seguente problema.

Ho due EAs per lo stesso strumento con diversi magiks rispettivamente. Ho impostato il mio magik attraverso CTrade e ho aperto una posizione anche attraverso CTrade. Quando ho una posizione aperta del primo EA, il suo magik è assegnato al secondo EA (l'ho controllato dopo aver aperto una posizione, vedi sotto), quindi il controllo delle posizioni aperte non vede il mio magik e apro molte posizioni in una direzione. Il conto è su una demo, questo non può essere rilevato nel tester. Se il valore del magik è salvato nella classe, forse deve essere azzerato, ma non so come.

Si prega diincollare il codice correttamente, non come un foglio di testo.


Per quanto riguarda il codice: impostate i parametri di ingresso di ogni EA con il suo magik. Diciamo che hai impostato il primo a 10001, poi il secondo a 10002.

 
Vladimir Karputov:

Si prega diinserire il codice correttamente, non come un foglio di testo.


Per quanto riguarda il codice: impostate i parametri di ingresso di ogni EA con la sua magia. Supponiamo che impostiate il primo a 10001, poi il secondo a 10002.

Grazie per una risposta così breve. Ma questo è il punto, le magie sono diverse. Così, ho stabilito che il secondo robot apre le posizioni con il primo mago. Non so come avviene e dove salva il primo numero magico di EA ma vorrei scoprirlo.

 
Pavel Nikiforov:

Grazie per la risposta rapida. Ma è questo il punto, i maghi sono diversi. Così ho scoperto che il secondo robot apre le posizioni con il numero magico del primo. Non so come avviene e dove salva il primo numero del mago, ma vorrei scoprirlo.

In questo caso, è meglio impostare il magik

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
prima di ogni apertura di posizione/ordine invece che in OnInit.
 
Alexey Viktorov:

In questo caso, è meglio specificare un magik

prima di ogni apertura di posizione, non in OnInit.

In questo caso, non è "meglio", è esattamente ciò di cui avete bisogno - è una classe wrapper per funzioni commerciali standard. Non memorizza magiks multipli. Ecco perché dovrebbe essere impostato un magik ogni volta prima e quando si vuole aprire una posizione con un nuovo magik.

Generalmente la sequenza è la seguente:

  • le posizioni dovrebbero essere aperte con magic 1 - impostiamo magic 1 e le posizioni successive avranno magic 1,
  • è necessario aprire le posizioni con un Mago 2 - impostiamo Mago 2 e tutte le posizioni seguenti avranno un Mago 2,
  • è necessario aprire posizioni con magic 3 - imposteremo magic 3 e ogni posizione successiva avrà magic 3,

ecc...

 
Alexey Viktorov:

In questo caso, è meglio impostare un magik

Prima di ogni apertura di una posizione/ordine, e non in OnInit.

In origine era così, non aiuta. Ma negli esempi è di solito in OnInit quindi si è spostato. Per molto tempo ho pasticciato con questo, i gufi sul test sembrano funzionare senza problemi, poi improvvisamente apro il server e ci sono 20 posizioni in una direzione. Può il fatto che il controllo delle posizioni aperte non avviene attraverso le classi?

 
Pavel Nikiforov:

Grazie per la risposta rapida. Ma è questo il punto, i maghi sono diversi. Così ho scoperto che il secondo robot apre le posizioni con il numero magico del primo. Non so come succede e dove salva il primo numero magico di EA ma voglio scoprirlo.

Poiché non esiste un metodoGetExpertMagicNumber nella classe CTrade, si prega di stampare questo codice dopo l'operazione di trading:

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

In questo modo puoi controllare se entrambi gli EA hanno magie diverse.

Motivazione: