MQL5で学び、共に書く - ページ 4

 
こんにちは!私は私のEAで正しく指標を呼び出している場合、誰かが私に教えてください?

double perceptron()
{
double w1 = x1 - 100;
double w2 = x2 - 100;
double w3 = x3 - 100;
double w4 = x4 - 100;
double a1 = iCustom(NULL,0, "カスタム CCI", 0);
double a2 = iCustom(NULL,0, "カスタム CCI", 7)
double a3 = iCustom(NULL,0, "Custom CCI", 14);//this is CCI

double a4=iMA(NULL,0,21,0,0,0);//this isForce Index

return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}.
 
Avelox   :
こんにちは、私のEAでインジケータを正しく呼び出すことができたかどうか、どなたか教えてください。

double perceptron()
{
double w1 = x1 - 100;
double w2 = x2 - 100;
double w3 = x3 - 100;
double w4 = x4 - 100;
double a1 = iCustom(NULL,0, "カスタム CCI", 0);
double a2 = iCustom(NULL,0, "カスタム CCI", 7)
double a3 = iCustom(NULL,0, "Custom CCI", 14);//this is CCI

double a4=iMA(NULL,0,21,0,0,0);//this is Force Index

return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}.


いいえ。

iCustomは、他のインジケーター呼び出し 関数と同様に、インジケーターハンドルを返します。ドキュメントを読む

 

ありがとうございました。じゃあ、こうだ!?double a2 = iCCI(NULL,0,7, 0);

double a4=iForce(NULL,0,21,0,0);

コンパイラは、以前のバージョンも受け入れます。

 

Alligatorのカスタムインジケータの例を見るhttps://www.mql5.com/en/code/9

そこに

  1. ハンドル(iMA)が取得される
  2. このハンドルから計算されるデータ量を監視する(BarsCalculated)
  3. データ部分をコピーする(CopyBuffer)
Alligator
Alligator
  • 投票: 14
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
The Alligator Indicator is a combination of Balance Lines (Moving Averages).
 
Avelox   :

ありがとうございました。じゃあ、こうだ!?double a2 = iCCI(NULL,0,7, 0);

double a4=iForce(NULL,0,21,0,0);

コンパイラも前のバリアントで満足するようになる。


コンパイラはちょうどいい。4コンパイラのインデュークを移植する際に、このようなコード断片を手に入れました。


   iMA1Handle=iMA(NULL,0,Period1/2,0,3,PRICE_CLOSE); // Не забыть потом перемножить на 2
   iMA2Handle=  iMA(NULL,0, Period1,   0,3,PRICE_CLOSE);
   SQPeriod=NormalizeDouble(MathSqrt(Period1),0);

... Бла-бла-бла ...

4ではこんな感じでした。

   while (i>=0)
      {
         ExtMapBuffer2[i]=2*iMA(NULL,0,PeriodX/2,0,3,PRICE_CLOSE,i);
         ExtMapBuffer3[i]=  iMA(NULL,0, PeriodX,0,3,PRICE_CLOSE,i);
         ExtMapBuffer4[i]=ExtMapBuffer2[i]-ExtMapBuffer3[i];
         i--;
      }
   i=i2; // Возврат i для расчёта значений индюка
   while (i>=0)
      {
         ExtMapBuffer1[i]=iMAOnArray(ExtMapBuffer4,0,NormalizeDouble(MathSqrt(PeriodX),0),0,3,i);

... Бла-бла-бла ...

5ではiMAOnArrayがないのと、ベータ版からのincludeを使いたくないので、一行ずつ翻訳することはできませんでした。最初は2*iMaを転送したのですが...なぜゴミのような出力になるのかが分かりませんでした。私は頭にきていた。フォーラムに書き込むところでした。それでわかったんです。私の癖が出たんですね。コンパイラは、5で返されたハンドルのデータ型が Int(実際には数値)であり、2倍できることから、これを受け入れる。しかし、出力ハンドルは疑問であり、そのように動作することはありません

 

5にシステムを移行しようとし始めると、すぐにトラブルが発生する

//+------------------------------------------------------------------+
//|                                                  GetInternet.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#import "wininet.dll"
  int InternetAttemptConnect (int x);
  int InternetOpenA(string sAgent, int lAccessType, 
                    string sProxyName = "", string sProxyBypass = "", 
                    int lFlags = 0);
  int InternetOpenUrlA(int hInternetSession, string sUrl, 
                       string sHeaders = "", int lHeadersLength = 0,
                       int lFlags = 0, int lContext = 0);
          
  int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, 
                       int& lNumberOfBytesRead[]);
  int InternetCloseHandle(int hInet);


#import "stdlib.ex5"
#import
input int Step = 300;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("Старт...");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    Comment(GetURL("http://www.forexremote.net"));
    
  }
//+------------------------------------------------------------------+


//+----------------------------------------------------------------------------------------------------------+
//| Функция получения WEB страницы                                                                           |
//+----------------------------------------------------------------------------------------------------------+
string GetURL(string url)
{
   int rv = InternetAttemptConnect(0);
   if(rv != 0)
     {
       Alert("Ошибка при вызове InternetAttemptConnect()");
       return("");
     }

   int hInternetSession = InternetOpenA("Microsoft Internet Explorer", 1, "", "", 0);
   if(hInternetSession <= 0)
     {
       Alert("Ошибка при вызове InternetOpenA()");
       return("");         
     }

   int hURL = InternetOpenUrlA(hInternetSession, url, "", 0, 0, 0);
   if(hURL <= 0)
    {
       Print("Ошибка получения данных с узла!");
       //fComment("Ошибка получения данных с узла!",true);
       InternetCloseHandle(hInternetSession);
       return("");         
     } 
          
   int cBuffer[256];
   int dwBytesRead[1]; 
   string TXT = "";
   while(!IsStopped())
     {
       bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);
       if(dwBytesRead[0] == 0)
           break;
       string text = "";   
       for(int i = 0; i < 256; i++)
         {
              text = text + CharToString(cBuffer[i] & 0x000000FF);
              if(StringLen(text) == dwBytesRead[0])
                  break;
              text = text + CharToString(cBuffer[i] >> 8 & 0x000000FF);
              if(StringLen(text) == dwBytesRead[0])
                  break;
           text = text + CharToString(cBuffer[i] >> 16 & 0x000000FF);
           if(StringLen(text) == dwBytesRead[0])
               break;
           text = text + CharToString(cBuffer[i] >> 24 & 0x000000FF);
         }
       TXT = TXT + text;
       //Sleep(500);

     }
     InternetCloseHandle(hInternetSession);
     return(TXT);
}
//+----------------------------------------------------------------------------------------------------------+
//| Конец Функции получения WEB страницы                                                                     |
//+----------------------------------------------------------------------------------------------------------+
コンパイルは0件、スクリプトは動作しない:-)
 
maxandsoft   :

5へのシステム移行を試し始めると、即座にヒヤリとする

コンパイルは0件、スクリプトは動作しない:-)


スクリプトとはどういう意味ですか。コード内の機能から判断して、EAコードを公開されていますね。MQL4でトランジションを 見る
 
Rosh   :


スクリプトというのはどういう意味ですか。コード内の機能から判断して、EAコードを公開されていますね。MQL4でトランジションを 見る


はい......EAです、もちろんそのままです。wininet.dllを使ってサーバーから応答を得る必要があります。
 
maxandsoft   :


はい、まさにアドバイザーです、もちろん口頭で。wininet.dllを使ってサーバーから応答を得る必要があります。

これらの関数は、なるべくユニコード版を使用するようにしてください。MQL5では、Unicodeエンコードを採用しています。

 
Rosh   :

これらの関数は、なるべくユニコード版を使用するようにしてください。MQL5では、Unicodeを使用しています。



ポイントは、デバッグ中にコンパイルすると、エラーも出ずにMQLエディタに戻されることです。また、チャートに引っ張っただけでは、チャート上に表示すらされません。 つまり、デバッグしてもEAを起動しても、どこにもエラーは出ないのです。