Formez toute la boucle dans une fonction, et renvoyez le numéro de la barre s'il est trouvé, ou WRONG_VALUE s'il n'est pas trouvé.
Bon après-midi. Je pense que j'ai fini de travailler avec l'iCustom problématique d'hier. J'ai fait tout cela sous la forme d'une fonction et j'ai utilisé"Commentaire" et "Impression" pour le contrôle.
L'idée de cet Expert Advisor d'essai est de capturer les signaux sous forme de flèches haut/bas de l'indicateur iCrossAD et de les transformer en commande d'achat ou de vente à utiliser dans un programme futur.
J'ai un peu d'expérience, alors s'il vous plaît, ne jugez pas sévèrement, mais une critique bien motivée et des conseils sur la façon de mieux faire seraient appréciés.
En fait, pour le bien de cette et a écrit un post. Fichiers EA et indicateur joints, le code ci-dessous.
//+------------------------------------------------------------------+//| Test_iCusom.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://mql5.com/ru/users/artmedia70"#property version"1.00"#property description""#property strict//--- includes#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---enum Indicator_Direction
{
Direction_BUY,
Direction_SELL,
Direction_FLAT
};
//---inputstring Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----inputuint InpPeriodFind = 400; // Bars for calculateinputuint InpUnheckedBars = 2; // Unchecked barsinputuint InpPeriodIND = 21; // CCI period//--- global variables
CEngine engine;
CTrade trade;
CPositionInfo apos;
CSymbolInfo asymbol;
int CrossAD; //Хэндл индикатора iCrossADdouble Buf_Arrow_Sell[], //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
Last_Arrow_Sell_volume, //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
Last_Arrow_Sell_index; //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossADdatetime Last_Arrow_Buy_time; //Переменная для записи времени стрелкиdouble Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
datetime Last_Arrow_Sell_time;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
ArraySetAsSeries(Buf_Arrow_Buy, true);
ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD",InpPeriodFind,InpUnheckedBars,InpPeriodIND);
if (CrossAD == INVALID_HANDLE)
{
Print("Не удалось создать описатель индикатора iCrossAD!");
return(INIT_FAILED);
}
elsePrint("Хендл iCrossAD = ",CrossAD);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- delete objectsObjectsDeleteAll(0,"",-1);
Comment("");
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
string direction = "no information";
switch(iCustom_iCrossAD(InpPeriodFind))
{
case Direction_BUY: direction = "BUY";
break;
case Direction_SELL: direction = "SELL";
break;
case Direction_FLAT: direction = "FLAT";
break;
caseWRONG_VALUE: direction = "no information";
break;
}
Comment("-------------------------",
"\n Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,
"\n Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,
"\n Last_Arrow_Buy_time = ",Last_Arrow_Buy_time,
"\n ---------------------- ",
"\n Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,
"\n Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,
"\n Last_Arrow_Sell_time = ",Last_Arrow_Sell_time,
"\n ---------------------- ",
"\n Indicator_Direction = ",direction
);
}
//+------------------------------------------------------------------+int iCustom_iCrossAD(uint PeriodFind)
{
Indicator_Direction direct = Direction_FLAT;
if (CopyBuffer(CrossAD, 1, 0, PeriodFind, Buf_Arrow_Buy) != PeriodFind)
{
Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
return(WRONG_VALUE);
}
for(int n=0; n<(int)PeriodFind; n++)
{
if(n==0)
Print("Last_Arrow_Buy_index n==",n," Last_Arrow_Buy_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Buy[n]==EMPTY_VALUE)
Print("Last_Arrow_Buy_index n==",n," Last_Arrow_Buy_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
{
Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
Last_Arrow_Buy_time = iTime(_Symbol,0,n);
Last_Arrow_Buy_index = n;
Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
break;
}
}
if (CopyBuffer(CrossAD, 2, 0, PeriodFind, Buf_Arrow_Sell) != PeriodFind)
{
Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
return(WRONG_VALUE);
}
for(int n=0; n<(int)PeriodFind; n++)
{
if(n==0)
Print("Last_Arrow_Sell_index n==",n," Last_Arrow_Sell_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Sell[n]==EMPTY_VALUE)
Print("Last_Arrow_Sell_index n==",n," Last_Arrow_Sell_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
{
Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
Last_Arrow_Sell_time = iTime(_Symbol,0,n);
Last_Arrow_Sell_index = n;
Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Sell_time = ",Last_Arrow_Sell_time);
break;
}
}
if(Last_Arrow_Buy_index < Last_Arrow_Sell_index)direct = Direction_BUY;
elseif(Last_Arrow_Buy_index > Last_Arrow_Sell_index)direct = Direction_SELL;
else direct = Direction_FLAT;
return(direct);
//return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
Bonjour, mon Expert Advisor a une fonction pour supprimer les ordres en attente lorsqu'un autre ordre se déclenche. Comment puis-je prescrire dans les paramètres externes pour pouvoir désactiver cette fonction ? Merci d'avance.
Priffekt: Bonjour, j'ai une fonction dans mon EA pour supprimer les ordres en attente lorsqu'un autre ordre se déclenche. Comment puis-je prescrire dans les paramètres externes pour pouvoir désactiver cette fonction ? Merci d'avance.
DeleteOppositeOrders();
void DeleteOppositeOrders() {
bool fd, fep1, fep2;
fep1=ExistPosition(1);
fep2=ExistPosition(2);
for (int i=OrdersTotal()-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
fd=False;
if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
if (fep2) fd=OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
if (fep1) fd=OrderDelete(OrderTicket());
}
if (fd && UseSound) PlaySound(NameFileSound);
}
}
}
}
bool ExistPosition(int mn) {
bool Exist=False;
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
Exist=True; break;
}
}
}
}
return(Exist);
}
C'est votre code, il est préférable de l'attacher de cette façon.
Bien sûr, je ne suis pas très adapté au rôle de conseiller, mais la tâche ne semble pas difficile.
Notez que je ne suis pas entré dans votre code lui-même, il y a beaucoup de controverses, même pour moi (les nuls), à commencer par le fait que votre fonction est de type void. Ce type est utilisé soit pour indiquer que la fonction ne renvoie pas de valeur, soit comme paramètre de la fonction indique l'absence de paramètres. Et vous avez return(Exist) à la fin de votre code ;
Déclarez une variable d'entrée, écrivez-la en tant que paramètre de votre fonction et quittez la fonction si vous donnez à cette variable la valeur False.
Priffekt: Bonjour, j'ai dans mon EA la fonction de suppression des ordres en attente lorsqu'un autre ordre se déclenche. Comment puis-je prescrire dans les paramètres externes que cette fonction peut être désactivée. Merci d'avance.
Trouvez tous les Faux et Vrais dans le texte de votre code. Remplacez-les par faux et vrai. Cette langue est sensible à la casse.
Trouvez tous les Faux et Vrais dans le texte de votre code. Remplacez-les par faux et vrai. Cette langue est sensible à la casse.
Bonjour, j'ai modifié toutes les valeurs, mais je suis intéressé par la possibilité de désactiver la fonction elle-même dans les paramètres du conseiller expert.
DeleteOppositeOrders() ; void DeleteOppositeOrders() { bool fd, fep1, fep2 ; fep1=ExistPosition(1) ; fep2=ExistPosition(2) ; for (int i=OrdersTotal()-1 ; i>=0 ; i--) { si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {Si (OrderSymbol()==Symbol()) { fd=false ; if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) { if (fep2) fd=OrderDelete(OrderTicket()) ; } if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) { if (fep1) fd=OrderDelete(OrderTicket()) ; } if (fd && UseSound) PlaySound(NameFileSound) ; } } } bool ExistPosition(int mn) { bool Exist=false ; for (int i=0 ; i<OrdersTotal() ; i++) { si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) {Exist=true ; break ; } } } return(Exist) ; }
Salut les développeurs,
Visualiser n'importe quel testeur de stratégie avec une date personnalisée ou une option de date quelconque
Voir l'image :
Je veux obtenir les valeurs des dates de début et de fin dans mon programme dans la fonction OnInit ().
Comment puis-je l'obtenir ?
Formez toute la boucle dans une fonction, et renvoyez le numéro de la barre s'il est trouvé, ou WRONG_VALUE s'il n'est pas trouvé.
Bon après-midi. Je pense que j'ai fini de travailler avec l'iCustom problématique d'hier. J'ai fait tout cela sous la forme d'une fonction et j'ai utilisé"Commentaire" et "Impression" pour le contrôle.
L'idée de cet Expert Advisor d'essai est de capturer les signaux sous forme de flèches haut/bas de l'indicateur iCrossAD et de les transformer en commande d'achat ou de vente à utiliser dans un programme futur.
J'ai un peu d'expérience, alors s'il vous plaît, ne jugez pas sévèrement, mais une critique bien motivée et des conseils sur la façon de mieux faire seraient appréciés.
En fait, pour le bien de cette et a écrit un post. Fichiers EA et indicateur joints, le code ci-dessous.
Bonjour !
J'ai converti l'indicateur de MT4 à MT5. Je veux utiliser l'indicateur comme un filtre supplémentaire.
Je suis en train d'étudier MT5. Mais je ne trouve pas l'erreur. Mes réflexions МТ4 et МТ5 sont différentes.
J'ai une demande aux experts - s'il vous plaît aidez-moi à trouver une erreur dans le fichier *.mql5.
Je joins le code source.
Je vous suis très, très reconnaissant pour votre aide.
Bonjour, j'ai une fonction dans mon EA pour supprimer les ordres en attente lorsqu'un autre ordre se déclenche. Comment puis-je prescrire dans les paramètres externes pour pouvoir désactiver cette fonction ? Merci d'avance.
C'est votre code, il est préférable de l'attacher de cette façon.
Bien sûr, je ne suis pas très adapté au rôle de conseiller, mais la tâche ne semble pas difficile.
Notez que je ne suis pas entré dans votre code lui-même, il y a beaucoup de controverses, même pour moi (les nuls), à commencer par le fait que votre fonction est de type void. Ce type est utilisé soit pour indiquer que la fonction ne renvoie pas de valeur, soit comme paramètre de la fonction indique l'absence de paramètres. Et vous avez return(Exist) à la fin de votre code ;
Déclarez une variable d'entrée, écrivez-la en tant que paramètre de votre fonction et quittez la fonction si vous donnez à cette variable la valeur False.
Bonjour, j'ai dans mon EA la fonction de suppression des ordres en attente lorsqu'un autre ordre se déclenche. Comment puis-je prescrire dans les paramètres externes que cette fonction peut être désactivée. Merci d'avance.
Trouvez tous les Faux et Vrais dans le texte de votre code. Remplacez-les par faux et vrai. Cette langue est sensible à la casse.
Trouvez tous les Faux et Vrais dans le texte de votre code. Remplacez-les par faux et vrai. Cette langue est sensible à la casse.
DeleteOppositeOrders() ; void DeleteOppositeOrders() { bool fd, fep1, fep2 ; fep1=ExistPosition(1) ; fep2=ExistPosition(2) ; for (int i=OrdersTotal()-1 ; i>=0 ; i--) { si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {Si (OrderSymbol()==Symbol()) { fd=false ; if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) { if (fep2) fd=OrderDelete(OrderTicket()) ; } if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) { if (fep1) fd=OrderDelete(OrderTicket()) ; } if (fd && UseSound) PlaySound(NameFileSound) ; } } } bool ExistPosition(int mn) { bool Exist=false ; for (int i=0 ; i<OrdersTotal() ; i++) { si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) {Exist=true ; break ; } } } return(Exist) ; }