[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 409

 

sss2019 です。



例を示してください。


こんな感じのスクリプトを作りました。

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

その結果、Printは次のように出力します。

0 4

1 4

以上、なぜかループがプリントされない

2 4

3 4

I 0 の代わりにOrderSelect(i, SELECT_BY_POS, MODE_TRADES) をループに追加しました。つまり、最初の注文は常に選択され、スクリプトは正しく動作します。ループが2つの注文を削除するとき、リストには2つの注文しかないのに、3番目の注文を選択しようとすることが判明したのです。

 
sss2019:


このようなスクリプトを作成しました。

結局は...

事例紹介
 
sss2019:

例を示してください、私はそうしました

for(i = OrdersTotal(); i > 0; i--)

役に立たなかった。


というのは、やはり考えなければならないからです。

for(i = OrdersTotal()-1; i >=0; i--)
 

このジレンマを解決するために

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

スクリプトは、線間の距離が最大になるように検索する。すべてのバーですべての値を出力し、最大範囲は1つのバーで1.6235、もう1つのバーで1.6208となっています。

Print(maxrange)を表示 させようとすると、0.086と表示されます。

 
sss2019:

このジレンマを解決するために

スクリプトは、線間の距離が最大に なるように検索する。すべてのバーですべての値を出力し、最大範囲は1つのバーで1.6235、もう1つのバーで1.6208となっています。

Print(maxrange)を出力してみると、0.086が返ってくる、全くわけがわからない、Pointで割っているのに。


これはジレンマではありません。ジレンマとは、2つの解決策のうちどちらがベストなのか分からない状態のことです。

さて、まず、iMA()関数のパラメータは6つではなく7つです。次に、int i の文字列で変数を宣言していますね。そしてさらに、iという変数はどこにも値が初期化されていない。その結果、ゼロになるか、前のアクティビティから残ったメモリのゴミが含まれています。そして3つ目は、whileループの配置が正しくないことです。さて、初期化後のi変数は0に等しいとしましょう。また、Ma1>Ma2という表現も成り立つとします。その結果、while(Ma1 > Ma2)の行でループが開始されることになります。次のループの繰り返しで、(Ma1 > Ma2) 式が真でなくなったことがわかり、ループは終了する。変数Ma1、Ma2には、最大となる距離は含まれません -最大距離は一度だけでした。この条件では、Ma1がMa2以下になったことだけが示される。

さらに、変数maxrangeはrange = (Ma1 - Ma2)/Point; という文字列の中だけで値が初期化されます。では、コードの他の場所で変数maxrangeを値で初期化していないので、if(range > maxrange) という条件が発生しない場合はどうでしょうか?つまり、計算結果とメモリセルのゴミを比較していることがわかります。ここでは、コード実行の結果として、理解しがたいプリントが表示されます。

 
ループ内で全てのMA値を出力していたのですが、全ての値が正しい、つまりこの期間の全てのMA値が列挙された、ということです。しかし、ここでの計算は間違っていて、範囲=(Ma1-Ma2)/ポイントです。
if(range > maxrange) maxrange = range;
 
sss2019:
そこがポイントで、ループ内のすべてのMA値を出力していたのですが、すべての値が正しい、つまりこの期間のすべてのMA値が検索されたことになるのです。しかし、ここでの計算は間違っていて、範囲=(Ma1-Ma2)/ポイントです。
if(range > maxrange) maxrange = range;

*ポイント

range = (Ma1 - Ma2)*Point





 
pako:

*ポイント

範囲 = (Ma1 - Ma2)*Point

ma1=0.6526、ma2=0.6516。ma1-ma2 = 0.6526-0.6516 = 0.0010となります。ポイント=0.0001。掛け合わせればビリビリになります。0,0010 * 0,0001 = 0,0000001
 
sss2019:
ループ内で全てのMA値を出力していたのですが、全ての値が正しい、つまりこの期間の全てのMA値が列挙された、ということです。しかし、ここでの計算は間違っていて、範囲=(Ma1-Ma2)/ポイントです。
if(range > maxrange) maxrange = range;

まあ、何が入力されているのか確認する必要がありますね。計算に関わる変数値はどれですか?
 

MQLチュートリアル のStandard Functionsの章、Graph Operationsのセクションに、次のような説明のWindowHandleという関数が あります。" ... 指定されたグラフが含まれるウィンドウ(ウィンドウハンドル)のシステムディスクリプタを返す".

質問:「ウィンドウハンドル」の意味(内容)、用途は

P.S.フォーラムを混乱させないために、事前にあなたの答えをありがとうございます。