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

 
paladin80:
D'après mon expérience, le moyen le plus efficace de trouver les erreurs est d'afficher un message dans les commentaires avec le numéro de l'erreur, suivi d'une exécution visuelle de l'EA. Au début, cela prend beaucoup de temps, mais ensuite on apprend rapidement à le faire sans erreur. Vous pouvez également exclure des parties du code avec /* ... */ vous pouvez déterminer comment le comportement de l'EA change.
Je fais la même chose))
 
alsu:
Tu as raison. De plus, lorsque nous sortons une valeur de la boîte, elle est de type double, mais si l'on donne la commande d'écrire le résultat dans une variable de type int, le compilateur prendra automatiquement toutes les mesures nécessaires pour mettre la valeur dans une nouvelle boîte.


Pour m'assurer que j'ai bien compris, je vous invite à lire mes réflexions sur votre dernier paragraphe... Nous avons donc l'expert mentionné ci-dessus :

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

Puis dans la ficelle :

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

Nous mettons une variable de type entier Experts dans la case "GV-variable" pour le stockage (en la convertissant en type double). Ensuite, si (hypothèse hypothétique) il y aurait une chaîne dans l'Expert Advisor

int New_Experts=Experts;

cela signifierait qu'il existe une commande pour écrire le résultat dans une variable de type int. Dans ce cas, le compilateur :

* prendrait d'emblée la valeur de la variable de type double,

* apporter les modifications nécessaires à la valeur de la variable Experts,

* affecter cette valeur à la variable Nouveaux_Experts et...

* mettre la valeur de la variable New_Experts dans une case "int".

Ainsi, le type de variable n'est rien d'autre qu'un emballage externe d'une certaine valeur ? et les variables GV ne peuvent donc pas être du type chaîne de caractères, car le déclassement n'est autorisé que pour les valeurs numériques, et les chaînes de caractères ne sont pas converties en nombres.

N'est-ce pas ?

Merci d'avance pour votre réponse.

 
Stells:
ce qui n'est pas le cas pour (f=1;f<Bars;f++)
{
Price1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT)
Prix2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT) ;
Ecart = Prix1 - Prix2 ;
Print ("Prix1="+Prix1, " Prix2="+Prix2) ;
if (Spread==0){t=f ; break;}
}
Price12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT) ;
Price22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT) ;
Spread2 = Price12 - Price22 ;


si (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { ouvrir une transaction }


je veux fixer la barre où l'écart était égal à zéro et contrôler l'écart à partir de celle-ci

if(MathAbs(Spread)<eps) { ........ } et vous devez toujours contrôler le résultat - que le point satisfaisant la condition soit trouvé ou non. À mon avis, il est préférable de créer une fonction distincte, par exemple, comme ceci :

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

Bonjour.

Savez-vous s'il existe une #propriété dans les indicateurs qui permet à l'indicateur de toujours afficher la même période, par exemple d1 ?

et il ne change pas même si vous changez d'horizon temporel dans MetaTrader ?

merci

------------------------------------------

oh... combien de pros.....

 

aide !!!!

comment appeler l'indicateur depuis le script, j'ai vraiment besoin qu'il soit affiché dans une fenêtre

 

Bonsoir, veuillez m'aider à modifier le code de l'EA :
1. Lors des tests, tout va bien, mais lors des transactions, la première transaction doit être ouverte manuellement, de même que le stop et le take. Je voudrais que l'EA commence à négocier automatiquement lorsque le prix arrive à un nouveau tick.
2. Puisque dans le cas d'un stop loss déclenché, la position suivante est ouverte avec deux fois le lot précédent, le lot peut théoriquement augmenter à l'infini (dans mon cas, jusqu'à 51,2), je voudrais le limiter (par exemple 0,8) avec la possibilité de changer le seuil. Lorsque le seuil est atteint et qu'un stop est déclenché, l'Expert Advisor ne se déconnecte pas et repart de 0.1.

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

Aidez-nous, s'il vous plaît. J'ai lutté toute la journée sans aucune aide.

L'ordre est sur le pickup (Main BAY, en attendant sellsstop comme filet de sécurité).

A la fermeture de la vente dans le no-loss, reporté à nouveau au même endroit.

Fais tourner ce truc,https://www.mql5.com/ru/code/8846.
 
7777877:


Pour m'assurer que j'ai bien compris, je vous invite à lire mes réflexions sur votre dernier paragraphe... Nous avons donc l'expert mentionné ci-dessus :

Puis dans la ficelle :

Nous mettons une variable de type entier Experts dans la case "GV-variable" pour le stockage (en la convertissant en type double). Ensuite, si (hypothèse hypothétique) il y aurait une chaîne dans l'Expert Advisor

cela signifierait qu'il existe une commande pour écrire le résultat dans une variable de type int. Dans ce cas, le compilateur :

* prendrait d'emblée la valeur de la variable de type double,

* apporter les modifications nécessaires à la valeur de la variable Experts,

* affecter cette valeur à la variable Nouveaux_Experts et...

* mettre la valeur de la variable New_Experts dans une case "int".

Ainsi, le type de variable n'est rien d'autre qu'un emballage externe d'une certaine valeur ? et les variables GV ne peuvent donc pas être du type chaîne de caractères, puisque le déclassement n'est autorisé que pour les valeurs numériques, et que les chaînes de caractères ne sont pas converties en nombres.

N'est-ce pas ?

Merci d'avance pour la réponse.

Pas exactement. Le point est que la variable Experts a déjà le type int, donc, la conversion de type doit avoir lieu AVANT de lui assigner une valeur, c'est-à-dire que le compilateur

* Une valeur de type double est sortie de la boîte (elle n'a pas de nom dans votre programme, et est simplement écrite à une adresse connue du compilateur dans la mémoire principale ou dans le registre du CPU).

* a apporté toutes les modifications nécessaires à la valeur de la variable ci-dessus et a écrit une nouvelle valeur (de type int !) dans la variable Experts,

* a affecté cette valeur (de type int !) à la variable New_Experts. Ils ont le même type, il s'agit donc simplement de copier une valeur d'un emplacement mémoire à un autre.


P.S. C'est génial de voir qu'il y a des gens qui comprennent leurs actes de manière aussi détaillée. En fait, sans blague. Restez en contact.

 
Andrew1001:

Bonsoir, veuillez m'aider à modifier le code de l'EA :
1. Lors des tests, tout va bien, mais lors des transactions, la première transaction doit être ouverte manuellement, de même que le stop et le take. Je voudrais que l'EA commence à négocier automatiquement lorsque le prix atteint un nouveau tick.
Puisque dans le cas d'un stop loss déclenché, la position suivante est ouverte avec le double du lot précédent, le lot peut théoriquement augmenter à l'infini (dans mon cas, jusqu'à 51.2), je voudrais le limiter (par exemple 0.8) avec la possibilité de changer le seuil. Lorsque le seuil est atteint et qu'un stop est déclenché, l'EA ne se déconnecte pas, mais recommence à partir de 0,1.


Essayez-le :

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
Bonjour. Pouvez-vous me dire où je peux lire comment faire des transactions dans le testeur, par moi-même ? Je vous en serais reconnaissant.