Eine Frage an MQL-Experten - Seite 8

 
Rita:
Danke, abolk, für die Klarstellung.


Es sieht so aus, als müssten mehrere Funktionen zu einer zusammengefasst werden. Die Logik ist überall dieselbe

 

-Guten Tag.

In unserem alten Expert Advisor verwendeten wir diese Positionseröffnung (I. Kims Funktion):

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

Jetzt schreibe ich einen anderen EA und kopiere diesen Teil des Codes

und plötzlich erhalte ich die folgende Meldung, wenn ich versuche, es zu kompilieren

Ich kann nicht herausfinden, warum ich Fehler bekomme! Der Kodex ist streng ausgewogen.

Und noch mehr! Wenn ich den Parameter ti(der in globalen Variablen deklariert ist) entferne, verschwinden die Kompilierungsfehler:

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

Aber ich brauche genau ein Ticket (ti), um die Ausführung der MessageBox anschließend zu realisieren.

Ich kann es seit heute Morgen nicht mehr herausfinden. Bitte teilen Sie uns mit, was hier ungenau ist?

Warum bekomme ich plötzlich Fehler beim Hinzufügen von ti= vor OpenPosition( - warum?


 

OpenPosition() muss als void deklariert werden und sollte int sein.

int OpenPosition(....){

....

}
 

Vielen Dank, Integer!

Ja, - genau das ist passiert! Jetzt habe ich es korrigiert und es wurde alles richtig kompiliert!

 

Nachmittags.

Der Expert Advisor hat plötzlich begonnen, ohne ersichtlichen Grund bei jedem Tick zu drucken:

2012.01.11 22:28:19 Complex_Common_01mod EURCHF,H1: Unbekannte Teilfensternummer -1 für ObjectCreate Funktion

Ich rufe den benutzerdefinierten Indikator im Code auf (siehe Abb.):

//-------------- задаем значения индикатора 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); 

Können Sie mir bitte sagen, woher der Fehler kommt? Das war vorher nicht der Fall. Ich habe den Code ein wenig geändert, ohne den Indikatorteil auch nur zu berühren!

Und das Tagebuch zeigte mir bei jedem Ticken diese Meldung an...

ObjectCreate-Funktion - im Code überhaupt nicht verwenden

 
Der Indikator sucht nach seinem Fensternamen und findet ihn nicht. siehehttps://docs.mql4.com/ru/customind/IndicatorShortName
 
Rita:

Vielen Dank, Integer!

Ja, - genau das ist passiert! Jetzt habe ich es korrigiert und es wurde alles richtig kompiliert!

Aber um das Ticket zu bekommen, müssen Sie Kims Funktion verfeinern.
 
FAQ:
Der Indikator sucht nach seinem Fensternamen und findet ihn nicht. siehehttps://docs.mql4.com/ru/customind/IndicatorShortName


Es stellt sich also heraus, dass dies ein Defekt des Indikators ist? Und keine Panne im Expert Advisor? Ich bin mir nicht sicher, was ich damit machen soll? Ich benötige im Code des EAs keinen Aufruf des Fensters dieses Indikators!

Bitte teilen Sie uns mit, wie dieser Fehler behoben werden kann. (- unbekannte Teilfensternummer -1 für ObjectCreate-Funktion ) ?

Hier ist der Indikatorcode:

#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); 
}
Binden Sie den Fensternamen nicht an den Objektnamen, sondern benennen Sie die Objekte mit eindeutigen Namen.
 
FAQ:
Binden Sie den Fensternamen nicht an den Objektnamen, sondern benennen Sie die Objekte mit eindeutigen Namen.

Danke, ich glaube, ich habe es verstanden - ich werde jetzt versuchen, das Fenster zu benennen und zu finden.