Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 732

 
Fox_RM:

Bonjour à tous !

Veuillez m'indiquer quel est le problème avec le transfert de valeur iCustom dans EA.

2014.10.12 10:23:06.656 TestGenerator : erreur de données non correspondantes (limite de volume 470 à 2014.03.14 21:45 dépassée)

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

Indicateur Correl8 sur un trombone.

Merci d'avance !

Téléchargez l'historique du symbole que vous testez. Erreur dans les données historiques, pas dans iCustom()
 
artmedia70:
Téléchargez l'historique du personnage testé. L'erreur se trouve dans les données historiques, pas dans iCustom().
Merci ! !!
 
borilunad:
Bonjour, Artyom ! Oui, c'est clair pour les magiciens ! Mais lorsque quelque chose n'est pas dans une boucle, mais dans des conditions de type if-else, il suffira de mettre la première condition if(Symbol()==mySymbol)(sans else, bien sûr), présentant précédemment mySymbol=Symbol() ?! Ainsi, toutes les variables de tous les EA sont les mêmes, mais chacun sur son propre graphique ! Je ne peux pas encore le vérifier, je suis encore en train d'écrire, de "faire le point" ! :)
Si la chaîne de caractères monSymbole=Symbole() ;, alors cette variable contiendra la valeur du symbole actuel. Par conséquent, pour chaque EA, qui effectue des transactions sur son propre graphique, la valeur de cette variable sera égale à la valeur du symbole sur lequel l'EA a été lancé.
 
artmedia70:
Si la chaîne mySymbol=Symbol() ;, alors cette variable contiendra la valeur du symbole actuel. Par conséquent, pour chaque EA qui opère sur son propre graphique, la valeur de cette variable sera égale à la valeur du symbole sur lequel l'EA a été lancé.
Je n'ai pas pensé à la ficelle ! Je suis toujours aux prises avec des erreurs dans des fonctions testées qui fonctionnent bien dans d'autres EAs !Merci beaucoup !
 

Impression vers un fichier. J'apprends à imprimer sur ce fichier.

Pourquoi les zéros sont imprimés dans 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());
}
 
Pouvez-vous me dire comment identifier un retrait sur le tableau ?
 
beginner:
Pouvez-vous me dire comment définir un retrait sur le tableau ?

Pour certains "ordres", OrderType() produit une valeur numériquement égale à 6. Ce sont les retraits et les dépôts.

Après un appel réussi de OrderSelect() (retourné vrai), vous pouvez déterminer la taille du retrait/rechargement par la valeur retournée par OrderProfit(), et par le signe de cette valeur - s'il s'agit d'un retrait ou d'un dépôt...

En outre, certains courtiers facturent des frais, imitant un retrait par le montant des frais. Vous pouvez essayer de distinguer l'imputation de la commission du retrait du compte par un commentaire obtenu à l'aide de OrderComment().

Attention toutefois : tout ceci n'est pas documenté et peut cesser de fonctionner à tout moment.

 
simpleton:


Merci !
 
Chers programmateurs ! Lors de l'optimisation d'un Expert Advisor, j'essaie personnellement, je pense, comme beaucoup d'autres participants, de trouver le ratio maximum de profit par rapport au drawdown maximum (ratio : profit/perte), qui est à mon avis l'indicateur le plus important. Je fais cette procédure manuellement après l'achèvement de l'exécution du testeur. Est-il possible d'automatiser ce processus ? Ou, comment chacun d'entre vous détermine-t-il ce paramètre ? Merci d'avance.
 
yosuf:
Chers programmateurs ! Lors de l'optimisation d'un Expert Advisor, j'essaie personnellement, je pense, comme beaucoup d'autres participants, de trouver le ratio maximum de profit par rapport au drawdown maximum (ratio : profit/perte), qui est à mon avis l'indicateur le plus important. Je fais cette procédure manuellement après l'achèvement de l'exécution du testeur. Est-il possible d'automatiser ce processus ? Ou, comment chacun d'entre vous détermine-t-il ce paramètre ? Merci d'avance.

Je le fais.

//+---------------------- 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));
}
//+------------------------------------------------------------------+

Raison: