Aidez-nous à écrire des EA gratuitement. 5 idées différentes. - page 15

 

C'est tout. Je vois. "Essayer" d'aider. Je pense qu'il est temps de partager quelques autres idées.

 
GeneratorID:

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);

}

Raison: