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

 

ループ内のコードが動作しない理由

while(!IsStopped())

{

コード

スリープ(50)。

}

が、ティックでは問題なく動作する

 
seka-s79:

ループ内のコードが動作しない理由

ニワトリはなぜ道路を走って渡らないのか
 

А!了解!ありがとうございます!!!

 

Symbol() MT4で問題が発生しました。

2つの機能で説明します。

string   SymbolOK()
{

   string   value;
   string   argument = "ANYTHING";

   if(false)
   {
      value = argument;
   }

   return(value);

}

string   SymbolPROBLEM()
{

   string   value;
   string   argument = Symbol();

   if(false)
   {
      value = argument;
   }

   return(value);

}

を実行すると、空文字列が出力されます。

int start()
{
   Comment(SymbolOK());
   return(0);
}

しかし、2番目の関数は、文字列ID "EURUSD "を出力します(まあ、チャートに依存しますが、関数のロジックによると、それは空の文字列になるはずですが、出力されます)。

int start()
{
   Comment(SymbolPROBLEM());
   return(0);
}

何が問題なのか理解するのを助けてください。ありがとうございました。

 
anton.veksler:

Symbol() MT4で問題が発生しました。

2つの機能で説明します。

を実行すると、空文字列が出力されます。

しかし、2番目の関数は、文字列ID "EURUSD "を出力します(まあ、チャートに依存しますが、関数のロジックによると、それは空の文字列になるはずですが、出力されます)。

何が問題なのか理解するのを助けてください。ありがとうございました。

if(false)は決して動作しないので、valueは何も変化せず、空文字列になる可能性が高いです。文字列変数の値がどのように開始されるかは分かりませんが。もしかしたら、全く起動しないかもしれません。その場合、あなたのバージョンでは何でも出力することができます。
 
Sepulca:
if(false)は決して動作しないので、valueは何も変化せず、空文字列になる可能性が高いです。文字列変数の値がどのように開始されるかは分かりませんが。もしかしたら、全く起動しないかもしれません。その場合、あなたのバージョンでは何でも出力することができます。

"...初期値が明示的に設定されていない場合、数値変数はゼロ(0)に、文字列変数は空文字列に初期化される..."...とあります。
 
zoritch:
"...初期値が明示的に設定されていない場合、数値変数はゼロ(0)に、文字列変数は空文字列に初期化される..."...



ほら、ドキュメントにも書いてあるじゃないですか...。しかし、一般的に言えば、ド...ン...な質問です。わざわざ、代わりに入力するほど難しくはない。

string   value;

というようなものです。

string   value="ЭтоСтрокаПокаЕёЕщёНиктоНеТрогал";
 
Sepulca:



ほら、ドキュメントにも書いてあるじゃないですか...。しかし、一般的には馬鹿な質問だと思います。代わりに入力するのは、それほど難しいことではありません。

というようなものです。


回答ありがとうございました。ドキュメントについてですが、明示的に初期化しないとstring変数は空文字列になりますが、この関数はツールの文字コードを返します。つまり、絶対に条件(意図的に偽)に入らないので、このバージョンでは値がSymbol()になるのか(この関数の例は誇張されています)、つまり暗黙の初期化で文字列変数は空文字列にならない(と本当に期待していた)のか、何か不明、というか暗黙の文字列初期化の仕組みが不明なのでありました。変数宣言の"詰め "は難しくないが、ドキュメントの外側のシステムの挙動が何となく分かりにくいだけだ。そして最も重要なことは、Symbol()を使用したときに起こることです。


string   SymbolPROBLEM()
{

   string   value;
   string   argument = Symbol();

   if(false)
   {
      value = argument;
   }

   return(value);

}
 

皆さん、こんにちは。

アービトラージExpert Advisorを書きました。DELTA_MA インディケータの 価格ラインの現在の乖離が、パラメータで設定されたDELTA 値を超えた場合に、エントリーシグナルが発生します。

//жжжжжжжжжжжжжжжжжжжжжжж Ищем возможность войти в рынок жжжжжжжжжжжжжжжжжжжжжжжж
// Задаем ценовые линии МА на 1-м баре
  MA_1=   (iMA(Symbol_1,Period(),per2,0,ma_method,Price,1)-
           iMA(Symbol_1,Period(),per1,0,ma_method,Price,1)) ;  
  MA_2= (iMA(Symbol_2,Period(),per2,0,ma_method,Price,1)-
         iMA(Symbol_2,Period(),per1,0,ma_method,Price,1))   ;                 
 ДЕЛЬТА_MA  =   MathAbs(MA_1 - MA_2 ) ; //- разность ценовых линий на 1 баре        
//------------------------------------------------ 

if (ДЕЛЬТА_MA > ДЕЛЬТА && MA_1 > MA_2)//если линии разошлись больше заданного значения
       //(первыя выше второй), то продаем 1-й инструмент и покупаем/продаем второй 
      TradeDOWN=true;       else TradeDOWN=false;

EAが正常に正しく動作しています問題は、最初の条件、つまり価格線が同時に収束した場合のみエントリーを許可するフィルターを挿入しようとしたときからです。

extern double       ДЕЛЬТА = 350;

extern string  ____F____  = "=== FILTER ===";
 extern bool     FILTER_= true; //Арбитр. вход реализуется только при схождении линий
このような条件下でのアルゴリズムは、以下のように実装されています。