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

 

Chers utilisateurs du forum !

Veuillez m'aider, les problèmes sont les suivants : 1) Comment prescrire dans le code, de sorte que la transaction, disons, sur la VENTE, ouvert lorsque la limite supérieure du canal, et fermé quand il atteint le bas ; 2) Avec un signal devrait ouvrir une seule transaction ; 3) lors de l'installation de l'EA, la transaction s'ouvre immédiatement, mais vous voulez que la transaction est ouverte que lorsque la ligne du canal est atteint.

Je vous serais très reconnaissant de votre aide.

extern double Lots = 0.1 ;
extern int TakeProfit = 30 ; // TakeProfit (un nombre négatif ou zéro pour éviter de l'utiliser) ;
extern int StopLoss = 20 ; // Niveau de Stop Loss pour l'achat ;
extern inttern Slippage = 2 ; // slippage
chaîne externe Commentaire = "Keller" ;
extern inttern Magic = 333 ;

extern string Indi = "Données de l'indicateur" ;
extern string TimeFrame = " cadretemporel actuel;
extern int int MA_Period = 10 ; // 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int Mode_MA = 0 ; // 0 - Close, 1 - Open, 2 - High, 3 - Low, 4 - Median, 5 - Typical, 6 - Weighted
extern int Price_Type = 5 ;

double PriceHigh, PriceLow, SL, TP ;
int ticket ;
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int init()
{
if (Digits ==3 || Digits ==3) // pour un courtier à cinq chiffres
{
TakeProfit *= 10 ;
StopLoss *= 10 ;
Dérapage *= 10 ;
}
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation des experts |
//+------------------------------------------------------------------+
int deinit()
{
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage de l'expert |
//+------------------------------------------------------------------+
int start()
{
PriceHigh = iCustom (Symbol(), 0, "Keller", TimeFrame, MA_Period, Mode_MA, Price_Type, 0, 0) ; // tampon top rouge 0
PriceLow = iCustom (Symbol(), 0, "Tma", TimeFrame, MA_Period, Mode_MA, Price_Type, 2, 0) ; // tampon de fond rouge 2

if (Bid >= PriceHigh && CountSell() == 0) // où Countsell vérifie que les ordres sont ouverts un par un et non à chaque tick.
{
SL = NormalizeDouble (Bid + StopLoss * Point, Digits) ;
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits) ;

ticket = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Comment, Magic, 0, Red) ; // où 0 est SL et TP (ceci est 0 pour ßn comptes) et le dernier 0 est une action
if (ticket > 0) // vérifier si un ordre est ouvert
{
si (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0) ; // où 0 est une expression
}
}


if (Ask <= PriceLow && CountBuy() == 0)// où Countsell vérifie que les ordres sont ouverts un par un, et non à chaque tick.
{
SL = NormalizeDouble (Ask - StopLoss * Point, Digits) ;
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits) ;

ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Comment, Magic, 0, Blue) ; // où 0 est SL et TP (ceci est 0 pour ßn comptes), et le dernier 0 est une action
if (ticket > 0) // vérifier si un ordre est ouvert
{
si (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0) ; // où 0 est une expression
}
}


if (Bid >= PriceHigh && CountBuy() > 0) // si le prix a atteint la limite supérieure du canal et que le nombre d'ordres est supérieur à 0
{
for (int i=OrdersTotal()-1 ; i >= 0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) // vérifier si c'est notre ordre d'achat
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black) ; // ferme l'ordre à la limite supérieure du canal
}
}
}
if (Ask <= PriceLow && CountSell() > 0) // si le prix a atteint la limite inférieure du canal et que le nombre d'ordres est supérieur à 0
{
for ( i=OrdersTotal()-1 ; i >= 0 ; i--) // pas de définition de variable pour buy
{
si(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_SELL) // vérifier si c'est notre ordre de vente
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black) ; // ferme l'ordre à la limite inférieure du canal
}
}
}

retour(0) ;
}

//+------------------------------------------------------------------+
int CountSell()// vérifier le nombre d'ordres de vente en cours.
{
int Count = 0 ;
for (int trade = OrdersTotal() - 1 ; trade >=0 ; trade --)
{
OrderSelect (transaction, SELECT_BY_POS, MODE_TRADES) ;
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
si (OrderType() == OP_SELL)
Compte++ ;
}
}
retourner(comte) ;
}
//+------------------------------------------------------------------+
int CountBuy()// vérification - nombre d'ordres d'achat en cours de traitement
{
int Count = 0 ;
for (int trade = OrdersTotal() - 1 ; trade >=0 ; trade --)
{
OrderSelect (transaction, SELECT_BY_POS, MODE_TRADES) ;
si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
si (OrderType() == OP_BUY)
Compte++ ;
}
}
retourner(comte) ;
}

 
Ajout d'une capture d'écran
 
artmedia70:

Non, ils ne l'ont pas fait. J'ai jeté un coup d'œil à votre code et j'ai répondu "sans regarder". Votre ligne :

- attribue à l'indice de cycle i une valeur égale au nombre total de lignes horizontales. Si vous en avez 3, le cycle sera de 2 à 0. On ne sait pas ce que contient votre cycle, mais il n'y aura que trois itérations de 2 à 0.


Ouais, eh bien... Et c'est exactement ce qui m'inquiétait. Le fait est que, sans expériences spécialement établies, mais juste par observation, cela a fonctionné en présence d'autres objets.

for(int i=ObjectsTotal(OBJ_HLINE)-1; i>=0; i--) 

Et à première vue, cela a fonctionné correctement. Mais il y avait des doutes sur la chose même que vous avez décrite. C'est pourquoi je voulais clarifier cet aspect.

Et je suis heureux que vos opinions aient confirmé mon hypothèse. Nous pouvons considérer que la certitude sur la question est atteinte.

Merci beaucoup encore une fois !

 
bistreevseh:


J'ai un indicateur personnalisé, c'est un histogramme, toutes les valeurs sont maximales, il n'importe que la couleur des barres dans l'histogramme, il n'a pas de paramètres d'entrée, tampon 2 : 0 - avec la barre rouge, et 1 - barre bleue, j'ai trouvé par méthode impériale, que dans 0 tampon, ne change pas la valeur, et dans 1 changements. Comment écrire les critères de la transaction je n'arrive pas à comprendre, s'il vous plaît expliquez comment, merci d'avance.


Si vous avez le code source de l'indicateur, ce n'est pas difficile : vous regardez le code source et trouvez les conditions de changement de couleur dans l'indicateur. En les utilisant, nous formons un signal. Il y a 2 façons de le faire, la première est d'écrire un "wrapper" pour analyser les conditions de changement des valeurs de la mémoire tampon, à ce niveau le code de l'indicateur n'est pas modifié, iCustom() est utilisé, la seconde convertit le code de l'indicateur en une fonction qui peut être appelée depuis le Conseiller Expert. Les deux méthodes sont décrites dans les articles du site web.

Si vous êtes intéressé, par exemple, par l'indicateur Heikin-Ashi lissé, consultez le site web - pour cet indicateur, il y a eu une discussion, autant que je m'en souvienne, tant sur l'exactitude de l'algorithme que sur l'analyse du signal. Le code est ouvert et est disponible dans la base de code (il y en a beaucoup là-bas).

Si l'indicateur est unique et ne possède pas de code source, l'affaire est beaucoup plus compliquée : il s'agit d'une ingénierie inverse, qui, soit dit en passant, ne justifie pas toujours l'effort.

 
VladislavVG:

Si vous avez le code source de l'indicateur, ce n'est pas difficile : regardez le code source et trouvez les conditions de changement de couleur dans l'indicateur. En les utilisant, nous formons un signal. Il y a 2 façons de le faire : la première - en écrivant un "wrapper" pour l'analyse des conditions de changement des valeurs de la mémoire tampon, le code de l'indicateur n'est pas modifié, iCustom() est utilisé, la seconde - en convertissant le code de l'indicateur en une fonction qui peut être appelée depuis le Conseiller Expert. Les deux méthodes sont décrites dans les articles du site web.

Si vous êtes intéressé, par exemple, par l'indicateur Heikin-Ashi lissé, consultez le site web - pour cet indicateur, il y a eu une discussion, autant que je m'en souvienne, tant sur l'exactitude de l'algorithme que sur l'analyse du signal. Le code est ouvert et est disponible dans la base de code (il y en a beaucoup là-bas).

Si l'indicateur est unique et ne possède pas de code source, l'affaire est beaucoup plus compliquée : il s'agit d'une ingénierie inverse, qui, soit dit en passant, ne justifie pas toujours l'effort.


Merci beaucoup, je vais faire un essai. Pourriez-vous m'aider à trouver des articles sur l'"habillage" et la conversion du code des indicateurs, car je crains de ne pas pouvoir interpréter cette information dans une requête de recherche.
 
Aidez-nous, s'il vous plaît. L'indicateur trace les lignes du haut et du bas de la journée précédente. J'en ai besoin pour tracer des lignes sur l'histoire tous les jours. Merci.
Dossiers :
line.mq4  3 kb
 
prom18:
Aidez-nous, s'il vous plaît. L'indicateur trace les lignes du haut et du bas de la journée précédente. J'en ai besoin pour tracer des lignes sur l'histoire tous les jours. Merci.
Dossiers :
line_1.mq4  3 kb
 
bistreevseh:

Merci beaucoup, je vais faire un essai. Pourriez-vous m'aider à trouver des articles sur le "wrapper" et la transformation du code de l'indicateur, car j'ai bien peur de ne pas pouvoir interpréter cela dans une requête de recherche.


https://www.mql5.com/ru/forum/114117 voici un exemple de création d'une fonction wrapper pour interpréter les signaux des indicateurs

Vous trouverez ici des articles sur l'utilisation des codes indicateurs :

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457

 
Vinin:



Merci !
 
VladislavVG:


https://www.mql5.com/ru/forum/114117 voici un exemple de création d'une fonction wrapper pour interpréter les signaux des indicateurs

Vous trouverez ici des articles sur l'utilisation des codes indicateurs :

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457


Encore une fois, merci beaucoup.