Une question pour les experts MQL - page 8

 
Rita:
Merci, abolk, pour cette clarification.


Il semble que plusieurs fonctions doivent être combinées en une seule. La logique est la même partout

 

Bon après-midi.

Dans notre ancien Expert Advisor, nous utilisions cette ouverture de positions (fonction de I. Kim) :

if (NumberOfPositions(NULL,OP_BUY,Magic1)<1 ) {//если нет откр. позиций
  ti=OpenPosition(NULL,OP_BUY, Lots,0 ,0,Magic1);
                                              } 
} }//если условия соответствуют заданным      

Maintenant j'écris un autre EA et je copie ce bout de code

et soudain, j'obtiens le message suivant lorsque j'essaie de le compiler

Je n'arrive pas à comprendre pourquoi je reçois des erreurs ! Le code est strictement équilibré.

Et en plus ! Lorsque je supprime le paramètre ti(qui est déclaré dans des variables globales), les erreurs de compilation disparaissent :

 if (NumberOfPositions(Symbol_1,-1, MagicNumber) ==1  && 
     NumberOfPositions(Symbol_2,-1, MagicNumber) <1 ) {
//если есть открытая позиция 1 символа, - открываем позицию второго символа: 
//ti=
  OpenPosition(Symbol_2,Positions_Symbol_2, Lots_1,0 ,0,MagicNumber);
                                                          }

 //if ( ti>0 )  
 //MessageBox("Позиции открыты! Не забудьте отключить Start_Trade",0,1 );

Mais j'ai besoin exactement avec un ticket (ti), afin de réaliser l'exécution de MessageBox après.

Je n'arrive pas à comprendre depuis ce matin. Veuillez me dire ce qui ne va pas ici.

J'obtiens tout à coup des erreurs en ajoutant ti= avant OpenPosition( - pourquoi ?


 

OpenPosition() doit être déclaré comme void et doit être int.

int OpenPosition(....){

....

}
 

Merci, Integer!

Oui, - c'est exactement ce qui s'est passé ! Maintenant je l'ai corrigé et tout s'est compilé correctement !

 

Après-midi.

L'EA a soudainement commencé à imprimer sur chaque tick sans raison apparente :

2012.01.11 22:28:19 Complex_Common_01mod EURCHF,H1 : numéro de sous-fenêtre inconnu -1 pour la fonction ObjectCreate

J'appelle l'indicateur personnalisé dans le code (voir fig.) :

//-------------- задаем значения индикатора Complex_Common по первому символу  --------
  double Complex_1_1=iCustom(NULL,Tf,"Complex_Common_01mod",Period_low,Period_fast,m,0); 
 //---------------задаем значения индикатора Complex_Common по второму символу ------------ 
  double Complex_1_2=iCustom(NULL,Tf,"Complex_Common_01mod",Period_low,Period_fast,n,0); 

Pourriez-vous me dire d'où vient l'erreur ? Ce n'était pas là avant. J'ai modifié un peu le code, sans même toucher à la partie indicateur !

Et le journal, à chaque tic, a commencé à me donner ce message...

Fonction ObjectCreate - ne pas utiliser du tout dans le code

 
L'indicateur cherche le nom de sa fenêtre et ne le trouve pas. Voirhttps://docs.mql4.com/ru/customind/IndicatorShortName.
 
Rita:

Merci, Integer!

Oui, - c'est exactement ce qui s'est passé ! Maintenant je l'ai corrigé et tout s'est compilé correctement !

Seulement, pour obtenir le ticket, tu dois affiner la fonction de Kim.
 
FAQ:
L'indicateur cherche le nom de sa fenêtre et ne le trouve pas. Voirhttps://docs.mql4.com/ru/customind/IndicatorShortName.


Il s'avère donc que c'est un défaut de l'indicateur ? Et pas un seul pépin dans le conseiller expert ? Je ne sais pas trop quoi en faire ? Je n'ai pas besoin dans le code de l'EA d'appeler la fenêtre de cet indicateur !

Veuillez me dire comment corriger ce défaut, si vous n'êtes pas pressé. (- numéro de sous-fenêtre inconnu -1 pour la fonction ObjectCreate ) ?

Voici le code de l'indicateur :

#property copyright "SemSemFX@rambler.ru"
#property link      "http://onix-trade.net/forum/index.php?showtopic=107"
//индикатор  Complex_Common_01mod 

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Lime
#property indicator_color2 DodgerBlue
#property indicator_color3 Red
#property indicator_color4 Magenta
#property indicator_color5 Aqua
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2

extern int Period_low = 21;
extern int Period_fast = 8;
//---- buffers
double USD[];
double EUR[];
double GBP[];
double CHF[];
double JPY[];

int wndNum;                                // Номер подокна индикатора
string wndName;                            // Наименование окна

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,USD);
   SetIndexLabel(0, "USD"); 
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,EUR);
   SetIndexLabel(1, "EUR"); 
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,GBP);
   SetIndexLabel(2, "GBP"); 
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,CHF);
   SetIndexLabel(3, "CHF"); 
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,JPY);
   SetIndexLabel(4, "JPY"); 
 
//----
   return(0);
  }

int deinit()  {
  // Удаляем все графические объекты
  DeleteObject("USD"); 
  DeleteObject("EUR");
  DeleteObject("GBP");
  DeleteObject("CHF");
  DeleteObject("JPY"); 
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- проверка на возможные ошибки
     if(counted_bars<0) return(-1);
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars-=10;
     limit=Bars-counted_bars;
  //---- основной цикл
      int Price=6; int Mode=2;
    
     for(int i=0; i<limit; i++)
       {
        USD[i]=
            (iMA("EURUSD",0,Period_low,0,Mode,Price,i)-
            iMA("EURUSD",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("GBPUSD",0,Period_low,0,Mode,Price,i)-
            iMA("GBPUSD",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("USDCHF",0,Period_fast,0,Mode,Price,i)-
            iMA("USDCHF",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("USDJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("USDJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        EUR[i]=
            (iMA("EURUSD",0,Period_fast,0,Mode,Price,i)-
            iMA("EURUSD",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURGBP",0,Period_fast,0,Mode,Price,i)-
            iMA("EURGBP",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURCHF",0,Period_fast,0,Mode,Price,i)-
            iMA("EURCHF",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("EURJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        GBP[i]=
            (iMA("GBPUSD",0,Period_fast,0,Mode,Price,i)-
            iMA("GBPUSD",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURGBP",0,Period_low,0,Mode,Price,i)-
            iMA("EURGBP",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("GBPCHF",0,Period_fast,0,Mode,Price,i)-
            iMA("GBPCHF",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("GBPJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("GBPJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        CHF[i]=
            (iMA("USDCHF",0,Period_low,0,Mode,Price,i)-
            iMA("USDCHF",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("EURCHF",0,Period_low,0,Mode,Price,i)-
            iMA("EURCHF",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("GBPCHF",0,Period_low,0,Mode,Price,i)-
            iMA("GBPCHF",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("CHFJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("CHFJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        JPY[i]=
            (iMA("USDJPY",0,Period_low,0,Mode,Price,i)-
            iMA("USDJPY",0,Period_fast,0,Mode,Price,i))*100
            +
            (iMA("EURJPY",0,Period_low,0,Mode,Price,i)-
            iMA("EURJPY",0,Period_fast,0,Mode,Price,i))*100
            +
            (iMA("GBPJPY",0,Period_low,0,Mode,Price,i)-
            iMA("GBPJPY",0,Period_fast,0,Mode,Price,i))*100
            +
            (iMA("CHFJPY",0,Period_low,0,Mode,Price,i)-
            iMA("CHFJPY",0,Period_fast,0,Mode,Price,i))*100
            ;
       }

   object("USD", "USD", 10, indicator_color1, 5);
   object("EUR", "EUR", 10, indicator_color2,18);
   object("GBP", "GBP", 10, indicator_color3,31);
   object("CHF", "CHF", 10, indicator_color4,44);
   object("JPY", "JPY", 10, indicator_color5,57);
  //----
    return(0);
  }
//+------------------------------------------------------------------+


// Удаляем графический объект
void DeleteObject(string name) {
  ObjectDelete(name+WindowExpertName());
}
// Рисуем метку
void object(string name, string _text, int fontsize, color color_, int value) {
 string objName = name+WindowExpertName();
 ObjectCreate(objName, OBJ_LABEL, WindowFind(WindowExpertName()), 0, 0);
 ObjectSetText(objName, _text, fontsize, "Verdana", color_);
 ObjectSet(objName, OBJPROP_CORNER, 1);
 ObjectSet(objName, OBJPROP_XDISTANCE, 4);
 ObjectSet(objName, OBJPROP_YDISTANCE, value); 
}
 
int wndNum;                                // Номер подокна индикатора  /// И ЭТО ТОЖЕ НЕ ИСПОЛЬЗУЕТЕ ВИДИМО ОСТАЛОСЬ ОТ ПРЕДЫДУЩЕГО ПИСАТЕЛЯ

string wndName=????;                            // Наименование окна /// ЧТО ЭТО ?????

// Удаляем графический объект
void DeleteObject(string name) {
  ObjectDelete(name+WindowExpertName());// Вы нашли окно предварительно? 
}
// Рисуем метку
void object(string name, string _text, int fontsize, color color_, int value) {
 string objName = name+WindowExpertName();
 ObjectCreate(objName, OBJ_LABEL, WindowFind(WindowExpertName()), 0, 0);// То же самое
 ObjectSetText(objName, _text, fontsize, "Verdana", color_);
 ObjectSet(objName, OBJPROP_CORNER, 1);
 ObjectSet(objName, OBJPROP_XDISTANCE, 4);
 ObjectSet(objName, OBJPROP_YDISTANCE, value); 
}
Ne liez pas le nom de la fenêtre au nom de l'objet, nommez simplement les objets avec des noms uniques.
 
FAQ:
Ne liez pas le nom de la fenêtre au nom de l'objet, nommez simplement les objets avec des noms uniques.

Merci, je crois que j'ai compris - je vais essayer de nommer et de trouver la fenêtre maintenant.