MQLエキスパートへの質問 - ページ 8

 
Rita:
abolk さん、わかりやすい説明ありがとうございました。


いくつかの機能を1つにまとめる必要があるようです。ロジックはどこでも同じ

 

-こんにちは。

昔のExpert Advisorでは、このポジションのオープンを使っていました(I.Kimの機能)。

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

今、私は別のEAを書いていて、このコードのビットをコピーしています。

で、いきなりコンパイルしようとすると、以下のようなメッセージが出ます。

なぜエラーが出るのかがわからない!コードのバランスは厳密です。

さらに!パラメータti(グローバル変数で宣言されている)を削除すると、コンパイルエラーは消えます。

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

しかし、その後のMessageBoxの 実行を実現するためには、まさにチケット(ti)が必要です。

今朝から解けません。どこが不正確なのか、アドバイスをお願いします。

なぜ突然、OpenPosition()の前にti=を 追加するとエラーが発生するのでしょうか?


 

OpenPosition()は void で宣言し、int とすること。

int OpenPosition(....){

....

}
 

インテージ さん、ありがとうございました。

はい、-まさにその通りです。今は修正し、すべて正常にコンパイルされるようになりました

 

午後

Expert Advisor が突然、明確な理由もなく、すべてのティックに印刷されるようになりました。

2012.01.11 22:28:19 Complex_Common_01mod EURCHF,H1:ObjectCreate 関数の 未知のサブウィンドウ番号 -1

コード内でカスタムインジケータを呼び出しています(図参照)。

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

エラーの発生箇所を教えていただけませんか?以前はなかったんですけどね。インジケータ部分には手をつけずに、コードを少し変更しました

そして、クリックするたびにジャーナルにこのメッセージが表示されるようになりました...。

ObjectCreate関数 - コード内で一切使用しない。

 
インジケータがそのウィンドウ名を検索し、見つからない。https://docs.mql4.com/ru/customind/IndicatorShortName を参照。
 
Rita:

インテージ さん、ありがとうございました。

はい、-まさにその通りです。今は修正し、すべて正常にコンパイルされるようになりました

ただ、チケットを手に入れるには、キムの機能を洗練させる必要があります。
 
FAQ:
インジケータがそのウィンドウ名を検索しても見つからない。https://docs.mql4.com/ru/customind/IndicatorShortName を参照してください。


つまり、インジケーターの不具合であることが判明したわけですね。Expert Advisorに不具合はないのか?どうすればいいのかわからない?このインジケータのウィンドウを呼び出すことはEAのコードでは必要ありません

この不具合を修正する方法を、急ぎでなければ教えてください。(-ObjectCreate関数の未知のサブウィンドウ番号-1) ?

以下はインジケータコードです。

#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); 
}
ウィンドウ名とオブジェクト名を結びつけず、オブジェクトにユニークな名前をつけてください。
 
FAQ:
ウィンドウ名とオブジェクト名を結びつけず、オブジェクトにユニークな名前をつけてください。

ありがとうございます!わかったような気がします。これからウィンドウに名前をつけて探してみます。