Questions des débutants MQL4 MT4 MetaTrader 4 - page 100

 

Bonjour à tous, pouvez-vous s'il vous plaît m'aider à trouver une erreur dans le code de l'EA, je pense que j'ai tout regardé, il semble que tout soit écrit correctement dans le code, mais le programme ne fonctionne pas correctement pour une raison quelconque ! L'idée est la suivante : le conseiller doit chercher deux longues bougies de la même direction (la longueur entre les bougies est ajustable dans le conseiller, c'est-à-dire entre les deux bougies minimum ou maximum, selon la direction), si le prix dans la direction opposée casse le minimum ou le maximum de la dernière bougie, une transaction doit s'ouvrir (Exemple de situations d'image sur le graphique joint au fichier). Le conseiller devrait ouvrir des transactions à chaque fois que la situation s'y prête, mais pour une raison quelconque, il n'ouvre des transactions que dans les fenêtres de trading entre les jours. Voici la situation, qui n'est pas difficile de programmeurs, s'il vous plaît aider, fixer l'erreur. Le code EA se trouve ci-dessous, ainsi que dans le fichier joint.


//+-----------------------------------------------------------------------------------------------+

//| Spacing_Candles.mq4 |

//| Copyright 2017, Vladim |

//| vk.com/id229534564 |

//| Courrier : Vladim120385@yandex.ru |

//+-----------------------------------------------------------------------------------------------+

#property copyright "Copyright 2017, Vladim"

#property link "vk.com/id229534564"

#propriété version "1.00"

#propriété stricte


//--- Paramètres de l'EA

extern string paramEA = "" ; // Paramètres EA

extern double volume = 0.01 ; // Volume

extern double stopLoss = 5 ; // StopLoss.

extern double takeProfit = 1.5 ; // TakeProfit

extern double maxSpacing = 150 ; // Espacement maximal

extern double minSpacing = 30 ; // Espacement minimal

extern double TrailingStop = 0 ; // TrailingStop

extern int magic = 127 ; // Magie


//--- variables globales

datetime newCandle ;

int tip ;


//+-----------------------------------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED) ;

}

//+-----------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+-----------------------------------------------------------------------------------------------+

void OnTick()

{

if(newCandle != Time[0]) FindPattern() ;

newCandle = Time[0] ;

}

//+-----------------------------------------------------------------------------------------------+

void OpenOrder(int type) // Ouvrir un ordre de marché

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, volume, Ask, 0, 0, 0, 0, "", magic, 0)) SetSLTP(OP_BUY) ;

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, 0, 0, "", magic, 0)) SetSLTP(OP_SELL) ;

}

//+-----------------------------------------------------------------------------------------------+

void SetSLTP(int type) //définir les ordres stop

{

double sl = 0 ;

double tp = 0 ;

if(type == OP_BUY)

for(int i = 0 ; i < OrdersTotal() ; i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits) ;

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Low[1]) * takeProfit, Chiffres) ;

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return ;

}

if(type == OP_SELL)

for(int i = 0 ; i < OrdersTotal() ; i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits) ;

tp = NormalizeDouble(OrderOpenPrice() - (High[1] - OrderOpenPrice()) * takeProfit, Chiffres) ;

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return ;

}

}

//+-----------------------------------------------------------------------------------------------+

void FindPattern() // Recherche d'une longue distance entre les chandeliers

{

if(High[1] < High[2] && Bid > High[1] && Low[1] < Low[2])

{

double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0) ;

if(maxSpacing >= espacement && minSpacing <= espacement)

OpenOrder(OP_BUY) ;

}

if(Low[1] > Low[2] && Bid < Low[1] && High[1] > High[2])

{

double spacing = NormalizeDouble((Low[1] - Low[2]) / _Point, 0) ;

if(maxSpacing >= espacement && minSpacing <= espacement)

OpenOrder(OP_SELL) ;

}

{

si(TrailingStop!=0) TrailingStop() ;

}

}

//+-----------------------------------------------------------------------------------------------+

void TrailingStop()

{

double StLo,OSL,OOP ;

bool error=true ;

for (int i=0 ; i<OrdersTotal() ; i++)

{

si (OrderSelect(i, SELECT_BY_POS))

{

tip = OrderType() ;

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits) ;

OOP = NormalizeDouble(OrderOpenPrice(),Digits) ;

si (tip==0)

{

StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits) ;

si (StLo < OOP) continuer ;

si (StLo > OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White) ;


}

si (tip==1)

{

StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits) ;

si (StLo > OOP) continuer ;

si (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White) ;

}

if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo) ;

}

}

}

}

//+-----------------------------------------------------------------------------------------------+

Dossiers :
 
Vladim1203:

Bonjour à tous, pouvez-vous s'il vous plaît m'aider à trouver une erreur dans le code de l'EA, je pense que j'ai tout regardé, il semble que tout soit écrit correctement dans le code, mais le programme ne fonctionne pas correctement pour une raison quelconque ! L'idée est la suivante : le conseiller doit chercher deux longues bougies de la même direction (la longueur entre les bougies est ajustable dans le conseiller, c'est-à-dire entre les deux bougies minimum ou maximum, selon la direction), si le prix dans la direction opposée casse le minimum ou le maximum de la dernière bougie, une transaction doit s'ouvrir (Exemple de situations d'image sur le graphique joint au fichier). Le conseiller devrait ouvrir des transactions à chaque fois que la situation s'y prête, mais pour une raison quelconque, il n'ouvre des transactions que dans les fenêtres de trading entre les jours. Voici la situation, qui n'est pas difficile de programmeurs, s'il vous plaît aider, fixer l'erreur. Le code EA se trouve ci-dessous et également dans le fichier joint.

Peut-être déjà assez, vous avez empilé des messages dans tous les fils, et en même temps créé le vôtre.

 
kuzhakov:

Salut.
Pouvez-vous me dire comment limiter le trading de l'EA par le temps.
J'ai essayé beaucoup de méthodes du forum, mais rien n'a marché, je ne comprends rien à l'écriture.
Ce serait bien si tu pouvais juste pointer du doigt ce qu'il faut mettre dedans.


Insérez-le après le démarrage. L'eXpert effectuera des transactions chaque jour à un intervalle de temps donné sur le terminal.


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

Bonjour à tous, pouvez-vous s'il vous plaît m'aider à trouver une erreur dans le code de l'EA, je pense que j'ai tout regardé, il semble que tout soit écrit correctement dans le code, mais le programme ne fonctionne pas correctement pour une raison quelconque ! L'idée est la suivante : le conseiller doit chercher deux longues bougies de la même direction (la longueur entre les bougies est ajustable dans le conseiller, c'est-à-dire entre les deux bougies minimum ou maximum, selon la direction), si le prix dans la direction opposée casse le minimum ou le maximum de la dernière bougie, une transaction doit s'ouvrir (Exemple de situations d'image sur le graphique joint au fichier). Le conseiller devrait ouvrir des transactions à chaque fois que la situation s'y prête, mais pour une raison quelconque, il n'ouvre des transactions que dans les fenêtres de trading entre les jours. Voici la situation, qui n'est pas difficile de programmeurs, s'il vous plaît aider, fixer l'erreur. Voir le code EA ci-dessous et également dans le fichier joint.


vérifier les conditions d'entrée pour l'achat et la vente

 
Vladim1203:

Bonjour à tous, pouvez-vous s'il vous plaît m'aider à trouver une erreur dans le code de l'EA, je pense que j'ai tout regardé, il semble que tout soit écrit correctement dans le code, mais le programme ne fonctionne pas correctement pour une raison quelconque ! L'idée est la suivante : le conseiller doit chercher deux longues bougies de la même direction (la longueur entre les bougies est ajustable dans le conseiller, c'est-à-dire entre les deux bougies minimum ou maximum, selon la direction), si le prix dans la direction opposée casse le minimum ou le maximum de la dernière bougie, une transaction doit s'ouvrir (Exemple de situations d'image sur le graphique joint au fichier). Le conseiller devrait ouvrir des transactions à chaque fois que la situation s'y prête, mais pour une raison quelconque, il n'ouvre des transactions que dans les fenêtres de trading entre les jours. Voici la situation, qui n'est pas difficile de programmeurs, s'il vous plaît aider, fixer l'erreur. Voir le code EA ci-dessous ainsi que dans le fichier joint.

Il est préférable d'écrire d'abord la partie de l'EA qui marquerait sur le graphique les bougies trouvées, afin que tout devienne clair. Et les lignes suivantes sont inutiles dans votre cas :

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

S'il vous plaît, aidez la communauté ...
*
J'ai téléchargé l'indicateur du filtre de Kalman depuis le forum (code source joint).
Tout va bien sur la carte.


Lorsque j'essaie de le lire dans Expert Advisor, la ligne suivante apparaît



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Produit le même grand nombre, évidemment sans rapport avec l'indicateur :

Qu'est-ce que cela peut être ?

Dossiers :
 
MikeZv:

L'aide de la communauté ...
*
J'ai téléchargé l'indicateur du filtre de Kalman depuis le forum (code source joint).
Tout va bien sur la carte.


Lorsque j'essaie de le lire dans Expert Advisor, la ligne suivante apparaît



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Produit le même grand nombre, évidemment sans rapport avec l'indicateur :

Qu'est-ce que cela peut être ?

EMPTY_VALUE

Valeur vide dans le tampon de l'indicateur

2147483647 (0x7FFFFFFFF)

 
Alekseu Fedotov:

EMPTY_VALUE

Valeur vide dans le tampon de l'indicateur

2147483647 (0x7FFFFFFFF)


:) Je l'ai déjà trouvé...
Pourquoi est-ce que ça sort ?

 
MikeZv:

:) Je l'ai déjà trouvé...
Mais pourquoi cela sort-il ?


L'indicateur a 2 tableaux car il y a 2 couleurs. Tant qu'il y a une ligne de la première couleur sur la barre, le tableau de la deuxième couleur est égal à EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1) ;

iValue = EMPTY_VALUE, alors la ligne sur 1 barre est orange. (parce que le tableau bleu = EMPTY_VALUE)

 
Nikolay Ivanov:

L'indicateur a 2 tableaux car il y a 2 couleurs. Tant qu'il y a une ligne de la première couleur sur la barre, le tableau de la deuxième couleur est égal à EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1) ;

iValue = EMPTY_VALUE, alors la ligne sur 1 barre est orange. (Parce que le tableau bleu = EMPTY_VALUE)


Merci, Nikolaï...
J'ai pris sur les deux lignes.
Puis je les ai fusionnés en un seul (en laissant un tampon). Même résultat.
*
J'ai une telle question :
L'indicateur a la variable draw_begin=500, c'est-à-dire le nombre de chandeliers à partir de la fin (du chandelier le plus récent) où le graphique est dessiné.
Et lorsque nous extrayons la valeur de l'indicateur en utilisant la méthode iCustom(), ces 500 points sont comptés à partir de quel chandelier ?
Pourquoi c'est important - draw_begin est utilisé non seulement pour le dessin, mais participe également au calcul de l'indicateur ...

Raison: