Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
C'est tout. Je vois. "Essayer" d'aider. Je pense qu'il est temps de partager quelques autres idées.
C'est tout. Je vois. "Essayer" d'aider. Je pense qu'il est temps de partager quelques autres idées.
Qui serait intéressé par un "vieux vélo" ? Vous n'avez toujours pas compris que ce que vous essayez de commencer à explorer a disparu depuis longtemps du forum et qu'il existe des implémentations libres dans la base de code - regardez et jouez autour. Vous avez vos propres idées ? Sinon, il n'y a rien à discuter.
Aidez-moi à ajouter le nombre maximum de commandes ouvertes au conseiller !
//+------------------------------------------------------------ --------------------+
//| v128-2.mq4 |
//| Copyright © 2011, Andrey N. Bolkonsky |
//| 21/03/2011 |
//| courriel : abolk@yandex.ru | Skype : abolk1 |
//+------------------------------------------------------------ --------------------+
#propriété copyright "Copyright © 2011, Andrey N. Bolkonsky"
#lien de propriété "abolk@yandex.ru"
//
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());
}
}
}
}
// nombre de commandes
}
//=++=========================================== = ================++=
// 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);
}