Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 732

 
Fox_RM:

Ciao a tutti!

Si prega di consigliare qual è il problema con il trasferimento del valore iCustom in EA.

2014.10.12 10:23:06.656 TestGenerator: errore dati non abbinati (limite di volume 470 al 2014.03.14 21:45 superato)

2014.10.12 10:23:53.468 2014.03.06 18:15 ClusterExp2 GBPUSD,M15: 2147483647 2147483647

Indicatore Correl8 su una graffetta.

Grazie in anticipo!

Carica la cronologia per il simbolo che stai testando. Errore nei dati della storia, non in iCustom()
 
artmedia70:
Carica la storia del personaggio da testare. L'errore è nei dati della storia, non in iCustom()
Grazie!!!
 
borilunad:
Buongiorno, Artyom! Sì, è chiaro che si tratta di maghi! Ma quando qualcosa non è in un ciclo, ma in condizioni di tipo if-else, sarà sufficiente mettere la prima condizione if(Symbol()==mySymbol) (senza else, ovviamente), presentando precedentemente mySymbol=Symbol()?! In modo che tutte le variabili di tutti gli EA siano le stesse, ma ognuno sul proprio grafico! Non posso ancora controllare, sto ancora scrivendo, "facendo uscire"! :)
Se la stringa mySymbol=Symbol();, allora questa variabile conterrà il valore del simbolo corrente. Di conseguenza, per ogni EA, che negozia sul proprio grafico, il valore di questa variabile sarà uguale al valore del simbolo, sul quale l'EA è stato lanciato.
 
artmedia70:
Se la stringa mySymbol=Symbol();, allora questa variabile terrà il valore del simbolo corrente. Di conseguenza, per ogni EA che negozia sul proprio grafico, il valore di questa variabile sarà uguale al valore del simbolo, sul quale l'EA è stato lanciato.
In qualche modo, non ho pensato alla corda! Sto ancora lottando con errori in funzioni testate che funzionano bene in altri EA!Grazie mille!
 

Stampa su un file. Sto imparando a stampare su questo file.

Perché stampa degli zeri in cl_time?

1,37243 1,37253 -1 07:27:13 00:00:00
1,37248 1,37256 -1 07:57:21 00:00:00
1,37256 1,37256 -1 08:17:30 00:00:00
1,37266 1,37268 -1 08:48:11 00:00:00
1,37267 1,37293 -1 08:53:15 00:00:00
1,37269 1,37307 1 09:17:57 00:00:00
1,37275 1,3727 1 10:23:02 00:00:00
1,37269 1,37269 1 10:28:03 00:00:00
1,37268 1,37231 1 10:33:10 00:00:00
1,37278 1,37255 1 10:57:38 00:00:00
1,37256 1,37269 -1 11:02:42 00:00:00
1,37268 1,37284 1 11:07:45 00:00:00
1,37283 1,37307 -1 11:12:49 00:00:00
1,37314 1,37335 1 12:11:37 00:00:00
1,37317 1,37323 1 12:23:12 00:00:00
1,37324 1,37326 1 12:28:20 00:00:00
1,37396 1,37415 1 13:26:32 00:00:00
1,37413 1,37419 1 13:37:20 00:00:00
1,3744 1,37578 1 13:56:29 00:00:00

//+------------------------------------------------------------------+
//|                                                    cci on ma.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"
#property strict

input double Lots                   =0.1;

input int Expiration           =5; //laikas minutemis

//---- input parameters
input int cci_p                     = 89;
input int ma                        = 13;
input int NumberOfBarsToCalculate   = 100;

input string   comment=".csv  or  .txt";//коментарий
input string   FileType="csv";//тип файла 

datetime op_time=0,cl_time=0;
double  op_price=0,cl_price=0;
int op_type=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   
   int    cnt,ticket,total;

   

//---
   if(Bars<cci_p+1)
     {
      Print("bars less than ",cci_p);
      return;
     }

//--- to simplify the coding and speed up access data are put into internal variables
   double cci_dn=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,2,0);
   double cci_up=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,3,0);
   

   total=OrdersTotal();
   if(total<1)
     {
      //--- check for long position (BUY) possibility
      if(cci_up>0 && cci_up!=EMPTY_VALUE)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"cci sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               
               op_time=TimeLocal();
               op_price=Close[0];
               op_type=1;
               Print("BUY order opened : ",OrderOpenPrice());
               Print("op_price : ",op_price, "op_time : ",op_time);
           }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
        }
      //--- check for short position (SELL) possibility
      if(cci_dn<0 && cci_dn!=EMPTY_VALUE)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"cci sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               
               op_time=TimeLocal();
               op_price=Close[0];
               op_type=-1;
               Print("BUY order opened : ",OrderOpenPrice());
               Print("op_price : ",op_price, "op_time : ",op_time);
           }
         else
            Print("Error opening SELL order : ",GetLastError());
        }
      //--- exit from the "no opened orders" block
      return;
     }
//--- it is important to enter the market correctly, but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
            if(TimeCurrent()>=op_time+Expiration*60)
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
               
               cl_time=TimeCurrent();//op_time+Expiration*60;
               cl_price=Close[0];               
               
               Print("OrderClose error ",GetLastError());               
               
              PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
      
               return;
              }  
           }
         else // go to short position
           {
            //--- should it be closed?
            if(TimeCurrent()>=op_time+Expiration*60)
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
               cl_time=TimeCurrent();//op_time+Expiration*60;
               cl_price=Close[0];              
               
               Print("OrderClose error ",GetLastError());               
               
               PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
                  
               return;
              }         
           }
        }
     }
//---
  }
//+------------------------------------------------------------------+
void PrintToFile(double opPrice=0,double clPrice=0,int opType=0, datetime opTime=0, datetime clTime=0)
{
   string fileName=StringConcatenate(Symbol()," ",Period()," ","gi_EA_cci");
   
   int handle;
   handle=FileOpen(fileName+FileType, FILE_WRITE|FILE_READ,";");
               if(handle!=INVALID_HANDLE)
               {
                  PrintFormat("Файл %s открыт для записи",fileName);
                  PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
                  //--- сначала запишем количество сигналов
                  FileSeek(handle, 0, SEEK_END);
                  FileWrite(handle,
                           opPrice,
                           clPrice,
                           opType,                           
                           TimeToString(opTime,TIME_MINUTES|TIME_SECONDS), 
                           TimeToString(clTime,TIME_MINUTES|TIME_SECONDS));
      
      
                  //--- закрываем файл
                  FileClose(handle);
                  PrintFormat("Данные записаны, файл %s закрыт",fileName);
               }
               else
               PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",fileName,GetLastError());
}
 
Potete dirmi come identificare un prelievo sulla scheda?
 
beginner:
Puoi dirmi come definire un prelievo sulla scheda?

Per alcuni "ordini", OrderType() produce un valore numericamente uguale a 6. Questi sono i prelievi e i depositi.

Dopo una chiamata a OrderSelect() che ha avuto successo (restituito true), si può determinare la dimensione del prelievo/ricarico dal valore restituito da OrderProfit(), e dal segno di questo valore - se è un prelievo o un deposito...

Inoltre, alcuni broker fanno pagare una tassa, imitando un prelievo per l'importo della tassa. Si può cercare di distinguere l'addebito della commissione dal prelievo dal conto con un commento ottenuto usando OrderComment().

Tuttavia, fate attenzione: tutto questo non è documentato e potrebbe smettere di funzionare in qualsiasi momento.

 
simpleton:


Grazie!
 
Cari programmatori! Quando si ottimizza un Expert Advisor, io personalmente, credo, come molti altri partecipanti, cerco di trovare il massimo rapporto tra profitto e massimo drawdown (rapporto: profitto/perdita), che credo sia l'indicatore più importante. Faccio questa procedura manualmente dopo il completamento dell'esecuzione del tester. È possibile automatizzare questo processo? Oppure, come fa ognuno di voi a determinare questo parametro? Grazie in anticipo.
 
yosuf:
Cari programmatori! Quando si ottimizza un Expert Advisor, io personalmente, credo, come molti altri partecipanti, cerco di trovare il massimo rapporto tra profitto e massimo drawdown (rapporto: profitto/perdita), che credo sia l'indicatore più importante. Faccio questa procedura manualmente dopo il completamento dell'esecuzione del tester. È possibile automatizzare questo processo? Oppure, come fa ognuno di voi a determinare questo parametro? Grazie in anticipo.

Lo faccio

//+---------------------- OnTester() --------------------------------+
double OnTester()
{
double Result     = 0;
double Profit     = TesterStatistics(STAT_PROFIT);
double Drowdown   = TesterStatistics(STAT_EQUITY_DD);

if(Drowdown>0)
Result = Profit/Drowdown;
else Result = 0;

   return(NormalizeDouble(Result,2));
}
//+------------------------------------------------------------------+