Je vais écrire un conseiller mql4 gratuit - page 13

 
oleg3791: le conseiller dessinait quatre lignes sur cinq clics de souris sur le graphique.

Lignes obligatoires en jaune

#property strict

int      Количество;
datetime старый, новый=0;
double   старая, новая=0;

void OnInit()
{
  Количество=0;
  ObjectsDeleteAll(0, "Линия");
}

void OnChartEvent(const int     id,  // идентификатор события   
                  const long &x, const double &yy,
                  const string& s)
{
  if(id!=CHARTEVENT_CLICK) return;
  if(Количество>4){OnInit();return;}
  string name[5]={"","Линия_1","Линия_2","Линия_3","Линия_4"};
  int y=int(yy);
  int O;
  старый=новый; старая=новая;
  ChartXYToTimePrice(0,int(x),y,O,новый,новая); // xy ---> время,цену
  if(Количество>0)
  ObjectCreate(name[Количество],OBJ_TREND,0,старый,старая,новый,новая);
  ObjectSet(name[Количество],OBJPROP_RAY,false);
  ObjectSet(name[Количество],OBJPROP_COLOR,Gold);
  ObjectSet(name[Количество],OBJPROP_WIDTH,2);
  Количество++; 
}

void OnDeinit(const int причина)
{
  OnInit();
}
 
STARIJ:

Lignes jaunes requises

Merci ! !!
 
oleg3791:   Merci ! !!

Maintenant, dites-moi comment faire du profit ici... Ou est-ce pour construire un jeu ?

 

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 |
//|                                                                  Mail: Vladim120385@yandex.ru |
//+-----------------------------------------------------------------------------------------------+
#property copyright "Copyright 2017, Vladim"
#property link      "vk.com/id229534564"
#property version   "1.00"
#property strict

//--- параметры советника
extern string paramEA    = "";     // Parameters EA
extern double volume     = 0.01;   // Volume
extern double stopLoss   = 5;     // StopLoss
extern double takeProfit = 1.5;    // TakeProfit
extern double maxSpacing = 150;   // MaxSpacing
extern double minSpacing = 30;    // MinSpacing
extern double TrailingStop  = 0;   // TrailingStop
extern int    magic      = 127;    // Magic

//--- глобальные переменные
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)   // Откроем рыночный ордер
{
   if(type == OP_BUY)  if(OrderSend(_Symbol, OP_BUY,  volume, Ask, 0, 0, 0, "", magic, 0)) SetSLTP(OP_BUY);
   if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, "", magic, 0)) SetSLTP(OP_SELL);
}
//+-----------------------------------------------------------------------------------------------+
void SetSLTP(int type)   // Установим стоп приказы
{
   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, Digits);
               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, Digits);
               if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;
            }
}
//+-----------------------------------------------------------------------------------------------+
void FindPattern()   // Ищем большое расстояние между свечами
{
   if(High[1] < High[2] && Bid > High[1] && Low[1] < Low[2])
   {
      double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0);
            
      if(maxSpacing >= spacing && minSpacing <= spacing)
         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 >= spacing && minSpacing <= spacing)
         OpenOrder(OP_SELL);
   }   
   {
      if (TrailingStop!=0) TrailingStop();      
   }
}
//+-----------------------------------------------------------------------------------------------+
void TrailingStop()
{
   double StLo,OSL,OOP;
   bool error=true;   
   for (int i=0; i<OrdersTotal(); i++) 
   {
      if (OrderSelect(i, SELECT_BY_POS))
      {
         tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
         {
            OSL   = NormalizeDouble(OrderStopLoss(),Digits);
            OOP   = NormalizeDouble(OrderOpenPrice(),Digits);
            if (tip==0)        
            {  
               StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);
               if (StLo < OOP) continue;
               if (StLo > OSL)
                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

            }                                         
            if (tip==1)    
            {                                         
               StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);           
               if (StLo > OOP) continue;
               if (StLo < OSL || OSL==0 )
                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);
            } 
            if (!error) Alert("Error TrailingStop ",GetLastError(),"   ",Symbol(),"   SL ",StLo);
         }
      }
   }
}
//+-----------------------------------------------------------------------------------------------+


Photo du graphique "Comment un EA devrait parier".

Dossiers :
 
Vladim1203:

Bonjour à tous, pouvez-vous s'il vous plaît m'aider à trouver une erreur dans le code de l'EA, je pense avoir tout regardé, il semble avoir été écrit correctement dans le code, mais le programme ne trade 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)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 
STARIJ:

Maintenant, dites-moi comment faire un profit ici... Ou en avez-vous besoin pour construire un jeu ?


Il n'y a pas encore de moyen d'obtenir un bénéfice. Il existe un algorithme pour le calcul de deux objectifs de prix probables, le long de la tendance, par cinq points majeurs, mais il est calculé sur un serveur spécial avec un abonnement payant. Je veux calculer les objectifs moi-même, le travail sur l'algorithme n'est pas encore terminé.

À quoi ressemblera votre programme dans MQL4 ?

 
Anton Yakovlev:
Si vous avez une bonne stratégie et que vous êtes prêt à la partager, je peux écrire un EA. Je vous invite à en discuter soit publiquement soit en message privé.

Anton, aide-moi, j'ai ajouté la fonction trailing stop à l'EA, je l'ai compilé et il montre deux erreurs. - On m'a fait un lavage de cerveau, je n'arrive pas à trouver comment les réparer pour obtenir une chouette. Cependant, les transactions sont fermées selon l'ancienne stratégie après que le prix ait touché la limite supérieure du canal et la limite inférieure, respectivement. Je suppose que quelque chose doit être changé ici aussi. - Rappelez les gars de l'armée du DNR.

#property copyright "Copyright 2017, MetaQuotes Software Corp."

#lien de propriété "https://www.mql5.com"

#propriété version "1.00"

#propriété stricte


//---------------------------------------------------------

extern double Lots = 0.01 ;

extern int TakeProfit = 600 ;

extern int StopLoss = 25 ;

extern int Magic = 0001 ;

extern int Slippage = 3 ;

extern int TralType = 0 ; // 0-SAR, 1-ATR, 2-HMA.

extern double SAR_Step = 0.02 ;

extern double SAR_Max = 0.2 ;

extern int ATR_Period = 14 ;

extern double ATR_K = 2.0 ;

extern inttern HMA_Period = 16 ;

extern intern HMA_Method = 3 ;

extern inttern HMA_Shift = 0 ;

datetime LBT ;

//---------------------------------------------------------

extern string TMA = "Paramètres de l'indicateur TMA" ;

extern string TimeFrame = "cadre temporel actuel" ;

extern int HalfLength = 56 ;

extern int Price = "PRICE_CLOSE ;

extern double ATRMultiplier = 2.0 ;

extern inttern ATRPeriod = 100 ;

extern bool Interpolate = true ;

//---------------------------------------------------------

double PriceHigh, PriceLow, SL, TP ;

int ticket ;


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

//| Fonction d'initialisation de l'expert |

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

int OnInit()

{

si (Chiffres == 3 || Chiffres == 5)

{

TakeProfit *= 10 ;

StopLoss *= 10 ;

Dérapage *= 10 ;

}

return(INIT_SUCCEEDED) ;

}

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

//| Fonction de désinitialisation experte |

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

void OnDeinit(const int reason)

{


}

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

//| fonction tick expert |

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

void OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0) ;

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0) ;

si(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red) ;

si (ticket > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits) ;

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

si (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur de modification de commande !")

}

}

si (CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue) ;

si (ticket > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits) ;

SL = NormalizeDouble(Ask - StopLoss*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur lors de la modification de l'ordre d'achat !")

} else Print("Erreur lors de l'ouverture de l'ordre d'achat") ;

}

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

//| Fonction d'initialisation de l'expert |

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

int init()

{

//--------


//--------

retour (0) ;

}

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

//| fonction tick expert |

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

void OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0) ;

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0) ;

si(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red) ;

si (ticket > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits) ;

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

si (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur de modification de l'ordre de vente !")

} else Print("Erreur d'ouverture de l'ordre de vente !")

}

si (CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue) ;

si (ticket > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits) ;

SL = NormalizeDouble(Ask - StopLoss*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur lors de la modification de l'ordre d'achat !")

} else Print("Erreur lors de l'ouverture de l'ordre d'achat") ;

}

si (Ask <= PriceLow && CountSell() > 0)

{

for (int i = OrdersTotal() -1 ; i>0 ; i--)

{

si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderMagicNumber() == Magic && OrderType() == OP_SELL)

if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))

Print("Erreur de fermeture de l'ordre de vente !")

}

}

}

si (Bid >= PriceHigh && CountBuy() > 0)

{

for (int i = OrdersTotal() -1 ; i>0 ; i--)

{

si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderMagicNumber() == Magic && OrderType() == OP_BUY)

if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))

Print("Erreur d'achat de OrderClose !")

}

}

}

}

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

int CountSell()

{

int count = 0 ;

for (int trade = OrdersTotal()-1 ; trade>=0 ; trade--)

{

if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)

compte++ ;

}

}

return(count) ;

}//+------------------------------------------------------------------+

int CountBuy()

{

int count = 0 ;

for (int trade = OrdersTotal()-1 ; trade>=0 ; trade--)

{

if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)

compte++ ;

}

}

return(count) ;

}

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

//| Fonction de désinitialisation experte |

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

int deinit()

{

//+-------


//+-------

retour (0)

}

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

//| fonction de démarrage de l'expert |

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

int Start()

{

//-----

bool error = fals ;

if (LBT!=Time[0]) {

si (OrdersTotal()!=0) {

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

if (OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()<2) {

double SL = OrderStopLoss() ;

si OrderType()==0) {

switch (TralType) {

cas 0 : SL = iSAR(NULL,0,SAR_Step,SAR_Max,0) ;

pause ;

cas 1 : SL = High[1] - iATR(NULL,0,ATR,Period,1)*ATR_K ;

pause ;

cas 2 : SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,",1,0,0) ;

pause ;

}

si (SL<OrderStopLoss())

SL = OrderStopLoss() ;

}

if (OrderType()==1) {

switch (TralType) {

cas 0 : SL = iSAR(NULL,0,SAR_Step,SAR_Max,0) ;

pause ;

cas 1 : SL = Low[1] + iATR(NULL,0,ATR,Period,1)*ATR_K ;

pause ;

cas 2 : SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,",1,0,0) ;

pause ;

}

si (SL>OrderStopLoss())

SL = OrderStopLoss() ;

}

si (SL!=OrderStopLoss()) {

if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0))

erreur = vrai ;

}

}

}

}

si (!error)

LBT = Time[0] ;

}

retour (0) ;

}

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

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
Выберите подходящую торговую стратегию и оформите подписку на нее в пару кликов. Все Сигналы сопровождаются подробной статистикой и графиками. Станьте Поставщиком торговых сигналов и продавайте подписку тысячам трейдеров по всему миру. Наш сервис позволит вам хорошо зарабатывать на прибыльной стратегии даже при небольшом стартовом капитале...
 
Andrey Luxe:

Pour acquérir de l'expérience dans ce domaine, j'écrirai gratuitement 25 EA pour vos idées et stratégies intéressantes.

Il ne reste que 19 EA


J'aiajouté la fonction de trailing stop à l'EA et je l'ai commenté mais il y a deux erreurs. - J'ai peut-être des erreurs, mais je ne sais pas comment les corriger. Cependant, les transactions sont fermées selon l'ancienne stratégie après que le prix ait touché la limite supérieure du canal et la limite inférieure, respectivement. Je suppose que quelque chose doit être changé ici aussi. - Rappelez les gars de l'armée du DNR.

#property copyright "Copyright 2017, MetaQuotes Software Corp."

#lien de propriété "https://www.mql5.com"

#propriété version "1.00"

#propriété stricte


//---------------------------------------------------------

extern double Lots = 0.01 ;

extern int TakeProfit = 600 ;

extern int StopLoss = 25 ;

extern int Magic = 0001 ;

extern int Slippage = 3 ;

extern int TralType = 0 ; // 0-SAR, 1-ATR, 2-HMA.

extern double SAR_Step = 0.02 ;

extern double SAR_Max = 0.2 ;

extern int ATR_Period = 14 ;

extern double ATR_K = 2.0 ;

extern inttern HMA_Period = 16 ;

extern intern HMA_Method = 3 ;

extern inttern HMA_Shift = 0 ;

datetime LBT ;

//---------------------------------------------------------

extern string TMA = "Paramètres de l'indicateur TMA" ;

extern string TimeFrame = "cadre temporel actuel" ;

extern int HalfLength = 56 ;

extern int Price = "PRICE_CLOSE ;

extern double ATRMultiplier = 2.0 ;

extern inttern ATRPeriod = 100 ;

extern bool Interpolate = true ;

//---------------------------------------------------------

double PriceHigh, PriceLow, SL, TP ;

int ticket ;


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

//| Fonction d'initialisation de l'expert |

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

int OnInit()

{

si (Chiffres == 3 || Chiffres == 5)

{

TakeProfit *= 10 ;

StopLoss *= 10 ;

Dérapage *= 10 ;

}

return(INIT_SUCCEEDED) ;

}

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

//| Fonction de désinitialisation experte |

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

void OnDeinit(const int reason)

{


}

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

//| fonction tick expert |

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

void OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0) ;

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0) ;

si(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red) ;

si (ticket > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits) ;

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

si (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur de modification de commande !")

}

}

si (CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue) ;

si (ticket > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits) ;

SL = NormalizeDouble(Ask - StopLoss*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur de modification de l'ordre d'achat !")

} else Print("Erreur lors de l'ouverture de l'ordre d'achat") ;

}

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

//| Fonction d'initialisation de l'expert |

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

int init()

{

//--------


//--------

retour (0) ;

}

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

//| fonction tick expert |

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

void OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0) ;

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0) ;

si(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red) ;

si (ticket > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits) ;

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

si (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur de modification de l'ordre de vente !")

} else Print("Erreur d'ouverture de l'ordre de vente !")

}

si (CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue) ;

si (ticket > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits) ;

SL = NormalizeDouble(Ask - StopLoss*Point, Digits) ;

if (OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Erreur de modification de l'ordre d'achat !")

} else Print("Erreur lors de l'ouverture de l'ordre d'achat") ;

}

si (Ask <= PriceLow && CountSell() > 0)

{

for (int i = OrdersTotal() -1 ; i>0 ; i--)

{

si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderMagicNumber() == Magic && OrderType() == OP_SELL)

if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))

Print("Erreur de fermeture de l'ordre de vente !")

}

}

}

si (Bid >= PriceHigh && CountBuy() > 0)

{

for (int i = OrdersTotal() -1 ; i>0 ; i--)

{

si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderMagicNumber() == Magic && OrderType() == OP_BUY)

if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))

Print("Erreur d'achat de OrderClose !")

}

}

}

}

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

int CountSell()

{

int count = 0 ;

for (int trade = OrdersTotal()-1 ; trade>=0 ; trade--)

{

if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)

compte++ ;

}

}

return(count) ;

}//+------------------------------------------------------------------+

int CountBuy()

{

int count = 0 ;

for (int trade = OrdersTotal()-1 ; trade>=0 ; trade--)

{

if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)

compte++ ;

}

}

return(count) ;

}

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

//| Fonction de désinitialisation experte |

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

int deinit()

{

//+-------


//+-------

retour (0)

}

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

//| fonction de démarrage de l'expert |

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

int Start()

{

//-----

bool error = fals ;

if (LBT!=Time[0]) {

si (OrdersTotal()!=0) {

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

if (OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()<2) {

double SL = OrderStopLoss() ;

si OrderType()==0) {

switch (TralType) {

cas 0 : SL = iSAR(NULL,0,SAR_Step,SAR_Max,0) ;

pause ;

cas 1 : SL = High[1] - iATR(NULL,0,ATR,Period,1)*ATR_K ;

pause ;

cas 2 : SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,",1,0,0) ;

pause ;

}

si (SL<OrderStopLoss())

SL = OrderStopLoss() ;

}

if (OrderType()==1) {

switch (TralType) {

cas 0 : SL = iSAR(NULL,0,SAR_Step,SAR_Max,0) ;

pause ;

cas 1 : SL = Low[1] + iATR(NULL,0,ATR,Period,1)*ATR_K ;

pause ;

cas 2 : SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,",1,0,0) ;

pause ;

}

si (SL>OrderStopLoss())

SL = OrderStopLoss() ;

}

si (SL!=OrderStopLoss()) {

if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0))

erreur = vrai ;

}

}

}

}

si (!error)

LBT = Time[0] ;

}

retour (0) ;

}

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

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
Выберите подходящую торговую стратегию и оформите подписку на нее в пару кликов. Все Сигналы сопровождаются подробной статистикой и графиками. Станьте Поставщиком торговых сигналов и продавайте подписку тысячам трейдеров по всему миру. Наш сервис позволит вам хорошо зарабатывать на прибыльной стратегии даже при небольшом стартовом капитале...
 
vkravtzov:

J'aiajouté la fonction de trailing stop au conseiller expert, et je l'ai compilé et j'ai obtenu deux erreurs. - J'ai perdu la tête, je n'arrive pas à trouver comment les réparer pour obtenir une chouette. Cependant, les transactions sont fermées selon l'ancienne stratégie après que le prix ait touché la limite supérieure du canal et la limite inférieure, respectivement. Je suppose que quelque chose doit être changé ici aussi. - Rendez-le aux gars de l'armée de la RPD.


Pas besoin de spam.
 
Victor Nikolaev:
Vous ne devriez pas faire de spam.

Je m'excuse si j'ai fait quelque chose de mal. Je ne comprends toujours pas comment j'ai pu spammer... Je crois que j'ai adressé deux messages à deux camarades. Ou cela n'est-il pas autorisé ? - C'est ma faute.