[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 413

 
Neo777:

Voici un EA pour que l'ordre s'ouvre sur le CLOSE de la bougie, et pas seulement sur une croix.

Je voudrais savoir comment ouvrir la commande.


Et comment comptez-vous savoir que la barre se fermera avec ce tick ? Peut-être par l'ouverture d'un nouveau bar?

Le code est inséré par le bouton SRC

 

OK.

Oui, le nouveau bar.

 
Neo777:

OK.

Oui, le nouveau bar.

https://www.mql5.com/ru/articles/1494 ici sont des moyens de déterminer si une nouvelle barre a commencé. Comment cela a commencé - vérifiez vos conditions
 

Bonjour, quelqu'un peut m'aider avec la fonction WindowScreenShot. Pour le 3ème jour, personne ne répond((. J'ai écrit le script suivant (voir fichier joint).

En 2 mots sur le scénario. Le script est destiné à faire des captures d'écran du graphique actuel de la fenêtre du terminal client. Dans la variable externe extern datetime Time_bar est spécifié le temps de la barre à partir duquel et jusqu'à la barre zéro sera créé (en tenant compte de l'indentation droite sur le graphique). Dans la ligne

int bar_number=iBarShift(NULL,0,Time_bar,true)

le numéro de série de la barre que nous avons spécifié dans la variable externe extern datetime time_bar est recherché. La fonction elle-même, dans la ligne

bool f=WindowScreenShot(name+".gif",1024,768,bar_number,Scale,View_graph)

Maintenant, voici la question... Pour simplifier, supposons que nous ayons besoin de créer une capture d'écran des deux dernières barres. Ensuite, si la ligne

int bar_number=iBarShift(NULL,0,Time_bar,true)

est laissé inchangé, le résultat sera la capture d'écran suivante


C'est-à-dire qu'il n'y a pas de barre dans la capture d'écran (bien que la chaîne de caractères

int bar_number=iBarShift(NULL,0,bar_time,true)

le numéro de la barre par heure doit être calculé)

Si cette ligne est présentée de la manière suivante

int bar_number=iBarShift(NULL,0,Time_bar,true)+2

vous obtiendrez la capture d'écran que nous voulions :

Question: pourquoi dans le cas où cette chaîne a la forme suivante

int bar_number=iBarShift(NULL,0,Time_bar,true)

la capture d'écran est prise avec un décalage de 2 barres à droite de celle spécifiée dans la ligne ci-dessus ?

P.S. Afin de ne pas encombrer le forum, merci d'avance pour la réponse.

Dossiers :
 
ilunga:
montrer le code + quels sont les paramètres d'entrée dans l'indicateur

Je l'ai vérifié 20 fois, je n'écrirais pas sans le vérifier 20 fois, tous les paramètres sont corrects comme dans l'indicateur. Le problème est peut-être ailleurs, peut-être avez-vous déjà rencontré un tel problème ?
 

Collègues ! Bonsoir !

J'ai découvert un indicateur QQE étonnant et j'ai décidé de trouver un conseiller expert basé sur cet indicateur.... et je n'ai pas pu le trouver. Cependant, sur ce forum, j'ai trouvé un message de l'utilisateur POZITIV.

Il a écrit la logique suivante : "lorsque la ligne rouge croise la ligne jaune vers le haut, un ordre d'achat doit être ouvert, lorsque la ligne rouge croise la ligne jaune vers le haut - un ordre de vente".

En conséquence, il avait un code du conseiller expert à moitié terminé.

J'ai calculé une autre logique pour moi-même : lorsque la courbe en gras croise la ligne pointillée de haut en bas - il faut vendre et fermer ce lot (acheter), lorsque la courbe en gras rouge croise la ligne pointillée de bas en haut. Et au même moment d'ouvrir immédiatement un autre lot (achat), qui devrait se fermer (vente) lorsque la situation inverse se produit.....-so constamment ouvrir un lot, et chaque croisement des lignes est utilisé pour fermer un et simultanément ouvrir un autre lot. Et l'intersection devrait probablement être considérée par leurs valeurs après la fermeture d'une barre, c'est-à-dire que si les 20 minutes (après la fermeture), en gras avaient une valeur de 51 (conditionnel), et les pointillés 50, et les 21 minutes (après la fermeture), en gras 50 et les pointillés 51, alors vous devez vendre. Pas de SL ou de TC.

En principe, la logique est simple. Pas de flèches, pas d'alarmes et de messages. Ne faites du commerce qu'en mode automatique dans sa forme pure.

Veuillez m'aider à affiner ce code (ci-dessous) à cette logique. Et il serait possible de régler la période (de 1 minute à 1 jour) et le paramètre SF (lissage).

Depuis deux jours, j'essaie de comprendre le code et de le corriger, mais je ne suis pas un programmeur(((((((((((.


J'espère vraiment votre aide !

//--- input parameters
extern double MaxRisk=1.0;
extern double FixLot = 0.01;
extern double Exponent=2.0;
extern int Magic=888;

// костыли

extern int TakeProfit=100;
extern int StopLoss=100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Count=0;
   double b0,b1;
   int ticket;

// параметры индикатора
   int SF=5; // original 5
   int RSI_Period=14; // original 14
   double DARFACTOR=4.236; //original 4.236

//------------ Параметры из индикатора QQEA -----------------------
// Buffer0 -- красная жирная
   string Buffer0=iCustom(NULL,0,"QQEA",SF,RSI_Period,DARFACTOR,0,0);
// Buffer1 -- жёлтый пунктир
   string Buffer1=iCustom(NULL,0,"QQEA",SF,RSI_Period,DARFACTOR,1,0);

   b0=StrToDouble(Buffer0);
   b1=StrToDouble(Buffer1);


   double Lot=GetLot(MaxRisk);
// если лот <0 выводим сообщение об ошибке
   if(Lot==0)
     {
      Alert("Недостаточно средств!");
      return(0);
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Lot!=0 && b0>b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_BUY,Lot);
      if(ExistOrders(Symbol(),1,888,0)==true) // проверяем наличие ордера sell
        {
         CloseOrder();
        }
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Lot!=0 && b0<b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_SELL,Lot);
      if(ExistOrders(Symbol(),0,888,0)==true) // проверяем наличие ордера buy
        {
         CloseOrder();
        }
     }

   Comment("Red line: ",b0,"Yellow line: ",b1);
   return(0);
  }
//-------------------------------------------------------------
//расчёт лота

double GetLot(int Risk)
  {
   double Free=AccountFreeMargin();
   double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step=MarketInfo(Symbol(),MODE_LOTSTEP);
   double Lot =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
   if(Lot<Min_Lot) Lot=Min_Lot;
   if(Lot>Max_Lot) Lot=Max_Lot;
   if(Lot*One_Lot>Free) return(0.0);
   return(Lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ExistOrders(string sy="",int op=-1,int Magic=-1,datetime ot=0)
  {
   int i,k=OrdersTotal(),ty;

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
      //+------------------------------------------------------------------+
      //|                                                                  |
      //+------------------------------------------------------------------+
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ty=OrderType();
         if(ty>1 && ty<6)
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || ty==op))
              {
               if(Magic<0 || OrderMagicNumber()==Magic)
                 {
                  if(ot<=OrderOpenTime()) return(True);
                 }
              }
           }
        }
     }
   return(False);
  }
//открытие нового ордера
int NewOrder(int Cmd,double Lot)
  {
   double TP=0; //тейкпрофит
   double SL=0; //стоплосс
   double PR=0; //Цена
   while(!IsTradeAllowed()) Sleep(100);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Cmd==OP_BUY)
     {
      PR=Ask;
      if(TakeProfit>0) TP=Ask+TakeProfit*Point;
      if(StopLoss>0) SL=Ask-StopLoss*Point;
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Cmd==OP_SELL)
     {
      PR=Bid;
      if(TakeProfit>0) TP=Bid-TakeProfit*Point;
      if(StopLoss>0) SL=Bid+StopLoss*Point;
     }
   if(GetOrdersCount(Magic,Cmd)>0)return(0);
   int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP," ",0,0,Green);
   if(tic<0) Print("Ошибка открытия ордера: ",GetLastError());
   return(tic);
  }
// закрытие ордера
void CloseOrder()
  {
   double PR=0;
   while(!IsTradeAllowed()) Sleep(100);
   if(OrderType()==OP_BUY) PR=Bid;
   if(OrderType()==OP_SELL) PR=Ask;
   if(!OrderClose(OrderTicket(),OrderLots(),PR,3,Red))
      Print("Ошибка закрытия ордера: ",GetLastError());
   return;
  }
//+------------------------------------------------------------------+
// подсчет кол-ва открытых позиций
int GetOrdersCount(int MagicNumber,int Type)
  {
   int count=0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      // already closed
      if(OrderSelect(i,SELECT_BY_POS)==false) continue;
      // not current symbol
      if(OrderSymbol()!=Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber()!=MagicNumber) continue;

      if(OrderType()==Type)
        {
         count++;
        }
     }

   return(count);
  }
//-------------------------------------------------------
 
sss2019:

Eh bien, j'ai tout vérifié 20 fois moi-même, sans vérifier 20 fois je n'écrirais pas, tous les paramètres sont corrects comme dans l'indicateur. Le problème se situe probablement ailleurs, peut-être quelqu'un a-t-il rencontré un tel problème ?
Rien d'autre que de mauvais paramètres entrés dans iCustom et qui ne peuvent pas l'être. Cherchez-le.
J'ai passé une soirée à essayer de le résoudre moi-même. J'ai mélangé la séquence des paramètres lors du transfert de l'externe d'un indicateur vers un EA. J'étais presque fou, la séquence des paramètres était la même :))
 
granit77:
Rien d'autre qu'une entrée incorrecte des paramètres dans iCustom et ce n'est pas possible. Cherchez.
J'ai moi-même passé une soirée à me battre avec elle l'autre jour. J'ai mélangé la séquence des paramètres lors du transfert des paramètres externes de l'indicateur vers le conseiller expert. J'étais presque fou, la séquence des paramètres était la même :))

iCustom(Symbol(),0,"RMRCS_entry-point"," ",5,6,7,62,-62,57,-57,54,-54,0.7,1.1,1.07," ",1,9,6,1,34,6,0,4,89,1,3,3.0,2.0,0.5,3.0," ",6,6,70,30,0.0,6,3.0," ",1,21,1,45,89,1,35,89,1,9," ",4,2,5,1," ",49,-49,0,0,0,0,0,0,0,0," ",0,34,200,150,1,100," ",1,3,1,1,2," ",1.4,3.7,0,1);


Et voici les paramètres

extern string REI_str = "";
extern int REI1_Per=5; 
extern int REI2_Per=6;     
extern int REI3_Per=7;     
extern int REI1_up=62;    
extern int REI1_dn=-62;    
extern int REI2_up=57;     
extern int REI2_dn=-57;            
extern int REI3_up=54;     
extern int REI3_dn=-54;            
extern double REI1_ct=0.7;  
extern double REI2_ct=1.1;  
extern double REI3_ct=1.07;
extern string MACD_str = "";
extern int MACD_FastMA_Meth=1;   
extern int MACD_FastMA_Per=9;    
extern int MACD_FastMA_Price=6; 
extern int MACD_SlowMA_Meth=1;   
extern int MACD_SlowMA_Per=34; 
extern int MACD_SlowMA_Price=6; 
extern int MACD_SL_Meth=0;      
extern int MACD_SL_Per=4;       
extern int MACD_Diap_Per=89;    
extern int MACD_Slope_Meth=1;   
extern int MACD_Slope_Per=3;  
extern double MACD_ct_1 = 3.0; 
extern double MACD_ct_2 = 2.0;  
extern double MACD_ct_3 = 0.5;  
extern double MACD_ct_4 = 3.0;  
extern string RSI_str = "";
extern int RSI_Per = 6;     
extern int RSI_Price = 6;  
extern int RSI_up = 70;      
extern int RSI_dn = 30;     
extern double RSI_ct1 = 0.0; 
extern int RSI_ct2 = 6;      
extern double RSI_ct3 = 3.0;
extern string CHO_str = "";
extern int  CHO_FastMA_Meth=1;      
extern int  CHO_FastMA_Per=21;      
extern int  CHO_SlowMA_Meth=1;      
extern int  CHO_SlowMA_Per=45;      
extern int  CHO_DiapVal_Per=89;     
extern int  CHO_MADiapVal_Meth=1;   
extern int  CHO_MADiapVal_Per=35;    
extern int  CHO_SlopeDiapVal_Per=89;  
extern int  CHO_MASlope_Meth=1;      
extern int  CHO_MASlope_Per=9;       
extern string Stoch_str = "";
extern int Stoch_KPer=4;       
extern int Stoch_DPer=2;        
extern int Stoch_Slow=5;        
extern int Stoch_SL_MA_Meth=1; 
extern string EntryLevel_str = "";
extern int REI_SvS_up = 49;  
extern int REI_SvS_dn = -49; 
extern int MACD_SvS_up = 0; 
extern int MACD_SvS_dn = 0;  
extern int RSI_SvS_up = 0;  
extern int RSI_SvS_dn = 0; 
extern int CHO_SvS_up = 0;  
extern int CHO_SvS_dn = 0;  
extern int STO_SvS_up = 0; 
extern int STO_SvS_dn = 0;  
extern string EntryOther_str = "";
extern int MALgthBar_Meth=0;
extern int MALgthBar_Per=34;
extern int MAXLgthBar = 200;
extern int TtS_MinABS = 150; 
extern int Shift_Points = 1; 
extern int Start_Calc = 100;   
extern string EntryCondition = "";
extern bool Ban_InvEntry = true;    
extern int InvEntry_Bars = 3;        
extern bool Ban_TtS_Decline=true;   
extern bool Ban_Entry_Series = true; 
extern int MAX_Entry_Series=2;      
extern string Gen_str = ""; 
extern double DiapBar_CtSl = 1.4;
extern double TakeProf_CtSl = 3.7;
 
sss2019:
Pouvez-vous me dire s'il y a une limite au nombre de paramètres dans un indicateur non standard, lorsqu'il est connecté via iCustom ?

J'ai... il y a un indicateur avec environ 8 paramètres J'ai entré tous les paramètres correctement, je l'ai vérifié plusieurs fois, mais l'erreur ')' apparaît toujours à la compilation. - Nombre de paramètres erronés D:\InstaTrader\experts_2.mq4 (11, 280)

Je dirais "environ 80"
 

Retirez l'extern de certains paramètres peu utilisés et il n'y aura pas de confusion.

Attention à mes questions :

Pourquoi des objets apparaissent-ils sous les chandeliers, quelle en est la raison ?

Pouvez-vous me rappeler comment faire une case à cocher à prix, quelle est la propriété de l'objet.

Raison: