Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 55

 
trader781:
Je n'utilise pas encore les classes, les tableaux, les macros et l'importation à partir des bibliothèques Windows. Tout cela au bon moment.
Tu n'aurais pas dû le faire avec des tableaux. Les tableaux sont pratiques. Et les structures aussi. Le reste, oui, vous pouvez ne jamais l'utiliser du tout si les projets ne sont pas très complexes.
 
Vitalie Postolache:
Avec les tableaux, c'est du gaspillage. Les tableaux sont pratiques. Et les structures aussi. Le reste, oui, ne peut jamais être utilisé du tout si les projets ne sont pas complexes.
Quant aux tableaux, je reconnais qu'ils sont très pratiques et qu'il est souvent impossible d'écrire un programme sensé sans eux. Les structures... J'aime utiliser les classes dans les programmes web, ce n'est vraiment pas pratique, surtout si le projet est important, et je n'aime pas utiliser MQ dans un conseiller expert habituel à une page. J'ai écrit en OOP toutes les données sur open/closed, j'ai commencé à utiliser et j'ai tout supprimé, j'ai réécrit en style procédural et en utilisant, j'ai tout écrit dans une boucle. Les cours sont donc un peu un goût acquis.
 
Vitaly Muzichenko:
Je suis d'accord pour dire que les tableaux sont très pratiques, et qu'il est souvent impossible d'écrire un programme de manière sensée sans eux. Les structures... J'écris des cours dans des programmes web, c'est vraiment mauvais et pas pratique sans eux, surtout si le projet est grand, mais je n'ai pas aimé MQ dans l'Expert Advisor habituel à une page. J'ai écrit en OOP toutes les données sur open/closed, j'ai commencé à utiliser et j'ai tout supprimé, j'ai réécrit en style procédural et en utilisant, j'ai tout écrit dans une boucle. Les cours sont donc pour les aficionados.
Hmmm. Qu'est-ce que ça a à voir avec les cours ? Les structures et les classes sont des choses un peu différentes. J'ai écrit sur les structures. MqlRates et ainsi de suite...
 

Aidez-moi à ajouter le nombre maximum de commandes ouvertes (MAXORders)


//
extern string rem2 = "=== Nombre de lots ===";
double externe _Lots0_1 = 0,1 ; // Niveau de base (pour la 1ère commande)
double externe _Lots0_2 = 0,1 ; // Niveau de base (pour le 2ème ordre)
//
extern string rem3 = "=== Paramètres supplémentaires ===";
externe entier _TakeProfit1_Proc = 50 ; // Pourcentage de risque pour le profit de la 1ère commande
externe entier _SpaseFromMaxMin = 1 ; // Décalage du haut/du bas
//
extern string rem4 = "=== Paramètres de rentabilité ===";
booléen externe _IsStopLoss_0 = faux ; // Activation de l'utilisation du seuil de rentabilité
externe entier _StopLoss_0_From = 0 ; // Décalage par rapport au seuil de rentabilité (en points)
externe entier _StopLoss_0_Level = 15 ; // Seuil de rentabilité
//
extern string rem5 = "=== Paramètres d'arrêt à la fin ===";
extern bool _IsTrailingStop = faux ; // Activer le stop suiveur
booléen _IsTrailingStopProfit = vrai ; // Activation d'un stop suiveur à partir d'une position d'équilibre
//extérieur entier _TrailingStopProfit_From = 0 ; // Décalage par rapport au seuil de rentabilité (en points)
externe entier _TrailingStopLevel = 15 ; // Niveau stop suiveur
externe entier _TrailingStopStep = 5 ; // Étape de mouvement d'arrêt de fuite
//
extern string rem6 = "=== Paramètres de l'outil ===";
chaîne externe _Symbolle = "" ; // Nom symbolique de l'instrument : "" - symbole courant
extern int _Timeframe = 0 ; // Période : 0 - période du graphique actuel
int_Digitss ; // Nombre de chiffres après la virgule dans le prix
double _Points ; // Taille en points dans la devise de cotation
extern int _Slippage = 2 ; // glissement
extern entier _Magic1 = 1281 ; // Nombre unique de commandes EA (1ère commande)
externe entier _Magic2 = 1282 ; // Nombre unique de commandes EA (2ème commande)
//
extern string rem7 = "=== Paramètres de l'indicateur MA1 ===";
extern int _MA1_Timeframe = PERIOD_D1 ; // Période : 0 - période du graphique actuel
extern int _MA1_Period = 20 ; // Période de moyennage pour le calcul de la moyenne mobile
externe entier _MA1_Shift = 0 ; // Décalage de l'indicateur par rapport au graphique des prix
extern int _MA1_Method = 0 ; // Méthode de moyenne : 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern entier _MA1_Applied_Price = 0 ; // Prix d'occasion : 0 - fermer, 1 - ouvrir, 2 - haut, 3 - bas
//
extern string rem8 = "=== Paramètres de l'indicateur MA2 ===";
extern int _MA2_Timeframe = PERIOD_H4 ; // Période : 0 - période du graphique actuel
extern int _MA2_Period = 20 ; // Période de moyennage pour le calcul de la moyenne mobile
externe entier _MA2_Shift = 0 ; // Décalage de l'indicateur par rapport au graphique des prix
extern int _MA2_Method = 0 ; // Méthode de moyenne : 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern entier _MA2_Applied_Price = 0 ; // Prix d'occasion : 0 - fermer, 1 - ouvrir, 2 - haut, 3 - bas
//
extern string rem9 = "=== Paramètres de l'indicateur des bandes de Bollinger ===";
//extern int _BB_Timeframe = 0 ; // Période : 0 - période du graphique actuel
extern int _BB_Period = 20 ; // Période de calcul de la moyenne de la ligne de l'indicateur principal
externe entier _BB_Deviation = 2 ; // Déviation de la ligne principale
externe entier _BB_Bands_Shift = 0 ; // Décalage de l'indicateur par rapport au graphique des prix
externe entier _BB_Applied_Price = 0 ; // Prix d'occasion : 0 - fermer
//
extern string rem10 = "=== Paramètres de l'indicateur ZigZag ===";
//extérieur entier _ZZ_Timeframe = 0 ; // Période : 0 - période du graphique actuel
externe entier _ZZ_ExtDepth = 12 ;
externe entier _ZZ_ExtDeviation = 5 ;
extern entier _ZZ_ExtBackstep = 3 ;
//
datetime_TimePrevious ;
datetime _TimeCurrent ;
//
chaîne_fstr ;
int_tp ;
//



void MaxOrders(int max_orders=5);










//=++=========================================== = ================++=
int init()
{
if(_Symbol == "") _Symboll = Symbol();
//
_Digitss = MarketInfo(_Symbol, MODE_DIGITS);
_Points = MarketInfo(_Symbol, MODE_POINT);
//
if(_Timeframe == 0) _Timeframe = Période();
Print("v128-2 > init() >> _Timeframe=", _Timeframe,
"rem4=",_IsStopLoss_0,
"rem5=",_IsTrailingStop,_IsTrailingStopProfit );
//
_fstr = "v128_" ;
_tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // assurez-vous que le fichier existe, s'il n'existe pas, créez-le
Print("v128-2 > init() >> _Timeframe=", _Timeframe, " _tp=",_tp);
//
_TimePrevious=iTime(_Symbol, _Timeframe, 0);
//
Print("v128-2 > Terminé : init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");
retour(0);
}


//=++=========================================== = ================++=
int start()
{
double P_Fermer1, P_Fermer2 ;
double BB_1_supérieur, BB_1_inférieur ;
double MA1_0, MA2_0 ;
double P_ask, P_bid ;
booléen is_signal_2_buy, is_signal_2_sell ;
doubler P1_acheter, P2_acheter, P3_acheter ;
double P1_vente, P2_vente, P3_vente ;
booléen is_b1 = faux, is_s1 = faux ;
booléen is_b2 = faux, is_s2 = faux ;
billet int ;
//
_TimeCurrent = iTime(_Symbol, _Timeframe, 0);
if(_TimeCurrent != _TimePrevious)
{
MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0);
MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Period, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0);
BB_1_upper = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1);
BB_1_lower = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1);
P_Fermer1 = iFermer(_Symbol, _Timeframe, 1);
P_Fermer2 = iFermer(_Symbol, _Timeframe, 2);
P_ask = MarketInfo(_Symbol, MODE_ASK);
P_bid = MarketInfo(_Symbol, MODE_BID);
Print("v120-4 > ", _Symbole, " | ", _Timeframe,
" -> MA1_0=", MA1_0, " | MA2_0=", MA2_0,
" -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower,
" -> P_Ferme1=", P_Ferme1, " | P_Ferme2=", P_Ferme2,
" -> ask=", P_ask, " | bid=", P_bid);
//
is_signal_2_buy = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower ;
is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper ;
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> is_signal2 -> buy=", is_signal_2_buy, " | sell=", is_signal_2_sell);
// ========== par marché
// ========== ouverture d'une commande ACHAT
si( is_signal_2_buy )
{
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> signal d'ouverture d'un ordre d'ACHAT");
CommandesSupprimeTout(OP_SELL);
//
si(!est_b1 || !est_b2)
{
P1_acheter = P_demander ;
P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point ;
_tp = (P1_buy - P3_buy) / _Point * (_TakeProfit1_Proc / 100.0);
P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> ACHETER -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, "_tp=", _tp);
//
ticket = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),
NULL, _Magic1, 0, CLR_NONE);
si(ticket == -1)
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> ACHETER (1) > Erreur (ouverture) #", GetLastError());
sinon est_b1 = vrai ;
//
ticket = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0,
NULL, _Magic2, 0, CLR_NONE);
si(ticket == -1)
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> ACHETER (2) > Erreur (ouverture) #", GetLastError());
sinon est_b2 = vrai ;
//
}
sinon { est_b1 = vrai ; est_b2 = vrai ; }
}
sinon { est_b1 = vrai ; est_b2 = vrai ; }
//Imprimer("= acheter +++",is_b1,is_b2,"==",is_s1,is_s2);
// ========== ouverture d'un ordre de VENTE
si( est_signal_2_vente )
{
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> signal d'ouverture d'un ordre de VENTE");
CommandesSupprimeTout(OP_BUY);
//
si(!est_s1 || !est_s2)
{
P1_vente = P_enchère ;
P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point ;
_tp = (P3_sell - P1_sell) / _Point * (_TakeProfit1_Proc / 100.0);
P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> ACHETER -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell);
//
ticket = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),
NULL, _Magic1, 0, CLR_NONE);
si(ticket == -1)
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> VENDRE (1) > Erreur (ouverture) #", GetLastError());
sinon est_s1 = vrai ;
//
ticket = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0,
NULL, _Magic2, 0, CLR_NONE);
si(ticket == -1)
Print("v128-2 > ", _Symbole, " | ", _Timeframe,
" -> VENDRE (2) > Erreur (ouverture) #", GetLastError());
sinon est_s2 = vrai ;
//
}
sinon { est_s1 = vrai ; est_s2 = vrai ; }
}
sinon { est_s1 = vrai ; est_s2 = vrai ; }
//Imprimer("= vendre +++",is_b1,is_b2,"==",is_s1,is_s2);
// ==========
si(est_b1 && est_s1 && est_b2 && est_s2)
_TimePrevious=_TimeCurrent ;
}
//
si(_IsTrailingStop)
{
if( !FindOrders(_Magic1) ) TrailingStop(_tp);
}
//
si(_IsStopLoss_0)
StopLoss_0(_StopLoss_0_From);
//
retour(0);
}


//=++=========================================== = ================++=
double DoubleTestZero(double valeur, double new_value)
{
if(value==0) return(value);
sinon return(new_value);
}


//=++=========================================== = ================++=
double ND(double valeur)
{
return( NormalizeDouble(value, _Digits) );
}


//=++=========================================== = ================++=
// commandes de clôture. Terminer sur fermer tout
annuler les commandesDeleteAll (int cmd)
{
tandis que (CountOrders (cmd)> 0)
{
for(int je = TotalCommandes() - 1; je >= 0; je--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (NuméroMagiqueCommande() == _Magic1 ||NuméroMagiqueCommande() == _Magic2)
&& (TypeCommande() == cmd) )
{
si(TypeCommande() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > ACHETER -> ticket=", OrderTicket(),
" -> Erreur (fermeture) #", GetLastError());
si(TypeCommande() == OP_SELL)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > VENDRE -> ticket=", OrderTicket(),
" -> Erreur (fermeture) #", GetLastError());
}
}
}

}

}



//=++=========================================== = ================++=
// comptage du nombre de commandes dans le sens
int CountOrders(int cmd)
{
entier n = 0 ;
for(int je = TotalCommandes() - 1; je >= 0; je--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (NuméroMagiqueCommande() == _Magic1 ||NuméroMagiqueCommande() == _Magic2)
&& (TypeCommande() == cmd) ) n++;
}
}
retour(n);
}


//=++=========================================== = ================++=
// recherche une commande par magie
bool FindOrders(int magique)
{
for(int je = TotalCommandes() - 1; je >= 0; je--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == magique) )
retour(vrai);
}
}
retour(faux);
}


//=++=========================================== = ================++=
// calculer le seuil de rentabilité par magie
annuler StopLoss_0 (entier de)
{
double point de profit, offre, demande ;
bool est ;
double P3_achat, P3_vente ;
//
for(int je = TotalCommandes() - 1; je >= 0; je--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue ;
//
si(TypeCommande() == OP_BUY)
{
enchère = MarketInfo(_Symbol, MODE_BID);
point de profit = (enchère - OrderOpenPrice()) / _Point ;
est = point de profit >= _StopLoss_0_Level + de ;
P3_buy = ND( OrderOpenPrice() + from * _Point );
//
if( is && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) )
{
Print("v128-2 b4 >", _Symbole, " | ", _Timeframe,
" -> Enchère=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,
" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 b4 > ", _Symbole, " | ", _Timeframe,
" -> BUY > ticket=", OrderTicket(), " > Error (breakeven) #", GetLastError());
}
}
//
sinon si(TypeCommande() == OP_SELL)
{
demander = MarketInfo(_Symbol, MODE_ASK);
point de profit = (OrderOpenPrice() - ask) / _Point ;
est = point de profit >= _StopLoss_0_Level + de ;
P3_sell = ND( OrderOpenPrice() - from * _Point );
//
if( is && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) )
{
Print("v128-2 b4 >", _Symbole, " | ", _Timeframe,
" -> Demander =", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,
" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 b4 > ", _Symbole, " | ", _Timeframe,
" -> VENDRE -> ticket=", OrderTicket(), " > Erreur (seuil de rentabilité) #", GetLastError());
}
}
}
}
}


//=++=========================================== = ================++=
// calcule l'arrêt de fuite par magie
annuler TrailingStop (entier de)
{
double point de profit, offre, demande ;
prix double ;
//
for(int je = TotalCommandes() - 1; je >= 0; je--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue ;
//
si(TypeCommande() == OP_BUY)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point ;
sinon fromprice = OrderStopLoss();
//
enchère = MarketInfo(_Symbol, MODE_BID);
point de profit = (enchère - ND(duprix)) / _Point ;
//
if( point de profit >= _TrailingStopLevel &&
enchère > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Imprimer("v128-2 v4 >", _Symbole, " | ", _Timeframe,
" -> Enchère=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(bid - (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Imprimer("v128-2 v4 >", _Symbole, " | ", _Timeframe,
" -> ACHETER > ticket=", OrderTicket(), " > Erreur (stop à la fin) #", GetLastError());
}
}
}
//
sinon si(TypeCommande() == OP_SELL)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - from * _Point ;
sinon fromprice = OrderStopLoss();
//
demander = MarketInfo(_Symbol, MODE_ASK);
point de profit = (ND(fromprice) - ask) / _Point ;
//
if( point de profit >= _TrailingStopLevel &&
demander < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Imprimer("v128-2 v4 >", _Symbole, " | ", _Timeframe,
" -> Ask=", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Imprimer("v128-2 v4 >", _Symbole, " | ", _Timeframe,
" -> VENDRE > ticket=", OrderTicket(), " > Erreur (stop à la fin) #", GetLastError());
}
}
}
}
}
}


//=++=========================================== = ================++=
// Recherche du fond local. Renvoie le prix
double FindPriceMinMax(bool isUp)
{
décalage entier = 1 ;
double prix = 0, p0,p1,p2 ;
tandis que(prix == 0)
{
p0 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift);
p1 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift);
p2 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift);
//Imprimer("v128-2 >", _Symbole, " | ", _Timeframe,
// " > sift=", shift, " | p0=", p0, " | p1=", p1, " | p2=", p2);
si (est en haut)
{
if(p0 !=0 && p0 == p1) // sommet trouvé
prix = p0 ;
}
autre
{
if(p0 != 0 && p0 == p2) // fond trouvé
prix = p0 ;
}
majuscule++ ;
}
//Imprimer("v128-2 >", _Symbole, " | ", _Timeframe,
// " -> retour(prix)=", prix);
retour(prix);
}


//============================================== = ====================
// Lit la variable du fichier.
// Si le fichier n'existe pas, créer un fichier et écrire la variable dans le fichier
double _FileReadWriteDouble (nom de fichier de chaîne, double valeur)
{
int h1 = FileOpen(filename, FILE_BIN);
si(h1 > 0)
{
valeur = FileReadDouble(h1, DOUBLE_VALUE);
FichierFerme(h1);
}
autre
{
h1 = FileOpen(filename, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, valeur, DOUBLE_VALUE);
FichierFerme(h1);
}
retour(valeur);
}


//============================================== = ====================
// Écrit la variable dans le fichier
void _FileWriteDouble(string filename, double value)
{
int h1 = FileOpen(filename, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, valeur, DOUBLE_VALUE);
FichierFerme(h1);

}

 
Vitalie Postolache:

Dans le code que vous avez montré ci-dessus, la référence est au TF actuel, alors de quoi parlons-nous ? Si vous faites référence au M5 depuis W1, écrivez-le de cette façon.

Si vous travaillez avec le cadre temporel actuel, alors le prix de clôture est flottant sur la barre zéro, et sur le reste - un seul prix de clôture, pas plusieurs, comment construire un histogramme sur une valeur, je ne comprends pas.

Si vous voulez dessiner une image, utilisez les boutons d'icône en haut de la boîte d'édition, il y a beaucoup de boutons utiles, je vous suggère d'apprendre.

Je demande comment obtenir les lectures maximales et minimales de l'indicateur dans le cadre temporel actuel pendant celui en cours,

Si vous pensez que je suis paresseux et que je ne veux pas chercher de photos, non. Mais je ne peux toujours pas le faire. Je clique avec le bouton droit de la souris sur le graphique dans le terminal (Insta) - Enregistrer en tant qu'image - Graphique actif tel quel - transféré à MKL5 (la même image du terminal y est affichée) - ligne inférieure bbCode (je sélectionne et copie le code), puis j'insère ce code dans le message, après avoir envoyé le message, il devrait y avoir une image dans le message(ce forum n'en a pas mais affiche seulement le texte du code), j'ai essayé d'utiliser le bouton "Images" (Ctrl+Alt+l) pour sélectionner le fichier et le code téléchargé ne peut pas être collé dans cette ligne, sans captures d'écran vous ne comprendrez pas.


 
vitek2010:

Je demande comment obtenir les lectures minimales et maximales de l'indicateur sur le cadre temporel actuel pendant le cadre actuel, j'ai donné des captures d'écran comme exemple,

Si vous pensez que je suis paresseux et que je ne veux pas chercher de photos, non. Mais je ne peux toujours pas le faire. Je clique avec le bouton droit de la souris sur le graphique dans le terminal (Insta) - Enregistrer en tant qu'image - Graphique actif tel quel - transféré à MKL5 (la même image du terminal y est affichée) - ligne inférieure bbCode (je sélectionne et copie le code), puis j'insère ce code dans le message, après avoir envoyé le message, il devrait y avoir une image dans le message(dans ce forum il n'est pas présent et seul le texte du code est affiché), j'ai essayé d'utiliser le bouton " Image (Ctrl+Alt+l) et il faut sélectionner le fichier et le code téléchargé n'est pas collé dans cette colonne, et vous ne comprendrez pas sans captures d'écran.

Au lieu du nom du fichier sur l'ordinateur local, vous pouvez insérer un lien, juste dans la même ligne, où ils écrivent le nom du fichier, tout fonctionne. Comme ceci

Il est également possible d'insérer un lien dans le message, mais sans balises, sur ce forum les balises ne fonctionnent pas. Comme ça.

Quant à l'obtention des prix d'une TF plus petite, il existe des CopyRates et des fonctions similaires pour chaque prix individuellement.

Il est copié dans le tableau, puis dans la boucle le temps est comparé au temps d'une bougie d'un TF supérieur, si la bougie inférieure correspond, alors le prix est compté dans l'indicateur.
 
Y a-t-il un moyen de voir les dessins de l'indicateur dans le testeur, car le graphique montre quelque chose qui m'a échappé.
Dossiers :
Tester11.gif  18 kb
 
trader781:
Pouvez-vous voir les dessins de l'indicateur dans le testeur, car à en juger par le graphique, j'ai raté quelque chose à cet endroit ?

Dans le testeur, il y a un bouton"Ouvrir le graphique". Je me demande à quoi ça sert ?

Ou la case à cocher "Visualisation".

 
Vitalie Postolache:

Dans le testeur, il y a un bouton"Ouvrir le graphique". Je me demande à quoi ça sert ?

Ou la case à cocher "Visualisation".

Je veux dire, pendant que le graphique défile, il n'y a pas d'indices.
 
trader781:
Je veux dire, pendant que le graphique défile, il n'y a pas de dindes.
Il n'y en a jamais eu. Vous les réglez à la main quand vous en avez besoin. Le test en pause, l'indicateur sur le graphique, et ensuite vous le faites tourner.
Raison: