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 !
//+------------------------------------------------------------------+//| 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 strictinputdouble Lots =0.1;
inputint Expiration =5; //laikas minutemis//---- input parametersinputint cci_p = 89;
inputint ma = 13;
inputint NumberOfBarsToCalculate = 100;
inputstring comment=".csv or .txt";//коментарийinputstring FileType="csv";//тип файла datetime op_time=0,cl_time=0;
double op_price=0,cl_price=0;
int op_type=0;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick(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 variablesdouble 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) possibilityif(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);
}
elsePrint("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibilityif(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);
}
elsePrint("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" blockreturn;
}
//--- 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 openedif(OrderType()==OP_BUY)
{
//--- should it be closed?if(TimeCurrent()>=op_time+Expiration*60)
{
//--- close order and exitif(!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 exitif(!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);
}
elsePrintFormat("Не удалось открыть файл %s, Код ошибки = %d",fileName,GetLastError());
}
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.
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() --------------------------------+doubleOnTester()
{
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));
}
//+------------------------------------------------------------------+
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
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 personnage testé. L'erreur se trouve dans les données historiques, pas dans iCustom().
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 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é.
Impression vers un fichier. J'apprends à imprimer sur ce fichier.
Pourquoi les zéros sont imprimés dans cl_time ?
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.
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.