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

 
lil_lil:

C'èFileSeek(File,0,SEEK_END); e tutto viene scritto nel file da una nuova linea.

Il problema è che ci sono 4 file e abbiamo bisogno di scrivere dati su quattro posizioni, ognuno in un file separato, ogni file ha un biglietto di posizione nel nome, ma i dati vengono scritti solo su uno, l'ultimo file, i dati sull'ultima posizione.

I nomi dei file sono formati correttamente? Invece di Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; scriverebbe File name=(string)OrderTicket()+Symbol()+".txt"; e aggiungere la direttiva #property strict all'inizio - aiuta ad eliminare gli errori
 
STARIJ:
I nomi dei file sono formati correttamente? Invece di Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; scriverei File name=(string)OrderTicket()+Symbol()+".txt"; e aggiungere la direttiva #property strict all'inizio - aiuta ad eliminare gli errori

Grazie, la formazione del nome è stata rifatta secondo la tua raccomandazione, ma scrive ancora solo i dati dell'ultima posizione.

E, i nomi dei nuovi file non sono cambiati) sospetto che non sia il nome, il file dell'ultima posizione è stato trovato comunque.

Perché ignora le posizioni precedenti?

 

1501896125EURUSD.txt
Tempo Metà prezzo BID
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Tempo Metà prezzo BID
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
cambiato qualcosa? vedi ... questo: stringa sy=""; int op=-1, mn=-1; appena necessario ... possiamo lasciar perdere? Nel ciclo invece di annidare if() è meglio continuare;

File:
Fileee.mq4  7 kb
 
STARIJ:

1501896125EURUSD.txt
Time Half BID Price
2018.02.22.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Time Half BID Price
2018.02.22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
cambiare qualcosa? vedere...questo: stringa sy=""; int op=-1, mn=-1; appena necessario ... possiamo lasciar perdere? Nel ciclo invece di annidare if() è meglio continuare;

Non vuole scrivere su tutte le posizioni.

Ci sono 7 posizioni aperte. Ho scritto un file.

L'ho compilato quando era su un grafico e ha iniziato a scrivere i dati della prima e dell'ultima posizione. Ora ho solo un dato, dalla prima posizione.

Non riesco a vedere sei, ma ho tutte le spunte inAlert(NameFile).

Di cosa ha bisogno...

 
ci sono molte condizioni nel programma, compresa una condizione che deve essere soddisfatta perché il file sia scritto:
se(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent()) // una volta ogni mezz'ora dall'apertura dell'ordine. È necessario?
{
t_pre=TimeCurrent();
Il programma contiene ramificazioni:
  for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || 
               OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     _o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
  for(i=0; i<k; i++) 
  {
     if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующему
     if(OrderSymbol()!=sy && sy!="") continue;   // а это вообще надо?
     if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?
     if(op>=0 && OrderType()!=op) continue;
     if(mn>=0 && OrderMagicNumber()!=mn) continue;
     _o_t=OrderOpenTime();
Qual era lo scopo di scriverlo in una scala prima? Nella vecchia versione di MQL4 accelerava l'esecuzione. Non ha importanza ora
La variabile _o_t è usata solo in 2 posti. Se lo sostituiamo con OrderOpenTime(), il programma diventa più chiaro e più corto in 2 righe (dichiarazione e assegnazione)
datetime _o_t; e
_o_t=OrderOpenTime();
 

Ho capito - il conto alla rovescia di 60 secondi deve essere tolto dal ciclo

//+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#property strict
bool RUS=true;
datetime t_pre=0;  // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   if(t_pre+60>=TimeCurrent()) return;      // Дождаться 60 секунд после прошлой обработки
   t_pre=TimeCurrent();                     // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!

   string text;
   for(int i=0; i<OrdersTotal(); i++) 
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
      string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
      Alert(ИмяФайла);
      if(OrderOpenTime()+60>=TimeCurrent()) continue;   // Пропуск молодых которым меньше 1 минуты
      if(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минут
      if(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
      if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}

      // Открытие или создание файла и перемещение указателя в конец
      int Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
      if(Файл == -1) {  Alert("Ошибка при открытии файла ",ИмяФайла);  return; }
      FileSeek(Файл,0,SEEK_END);

      // Если новый файл записать имя файла и строку заголовков колонок
      if(FileSize(Файл)==0)
      {
         FileWrite(Файл,ИмяФайла);
         FileWrite(Файл,"           Время Полу   BID     Цена ");
      }
      // Сбор информации и запись в файл
      FileWrite(Файл, TimeToStr(TimeCurrent()), text,
                dstr(Bid), "  ", dstr(OrderOpenPrice()));
      FileClose(Файл);
   }
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
   if(!RUS) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
File:
-Fi----.mq4  5 kb
 

Buon pomeriggio, cari utenti del forum.

Puoi dirmi perché l'ottimizzazione e il test delle stesse impostazioni a volte producono risultati diversi?

Ho scaricato le citazioni da SQ Tick Downloader e le ho fatte passare attraverso lo script

 
Aidar Kaliaskar:

Buon pomeriggio, cari amici.

Puoi dirmi perché l'ottimizzazione e il test delle stesse impostazioni a volte producono risultati diversi?

Ti dirò di più: quando si fa trading su un conto reale con un broker su 2 conti diversi si possono ottenere risultati diversi.
 
Vladislav Andruschenko:
Ti dirò di più: quando si fa trading su un conto reale con lo stesso broker su 2 conti diversi, ci possono essere risultati diversi.

Probabilmente dipende più dal broker. Ma potresti darmi un suggerimento sulla domanda iniziale?

 
Aidar Kaliaskar:

Probabilmente dipende più dal broker. Ma potresti dare qualche indicazione sulla domanda iniziale?

Spread, se fatturato al corrente. La data di fine del test se è fatturata a quella attuale. Ci potrebbero essere molte altre ragioni per questo.