どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 901

 
.roman.:

不要な計算(問題とは無関係)を削除しました。プリンターは、この問題を示すために特別にコードに追加されました。注文記号とEAが開いている記号を比較したにもかかわらず、次のように表示されることがあります(Oziチャートから、例えばこのケースのようにユーロで注文データを取ります)。

                        if(Ask>openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     

これはありえない、カンガルーのAskが2015年のユーロドルのどの建値よりも 高いなんてことはありえない...。

また、選択された順序に対するすべてのチェックは、選択後に別の if() 節で行う方がよいでしょう。

 
evillive:

これはありえない、カンガルーのAskが2015年のユーロドルのどの始値よりも高いということはありえない...。

そして、選択されたオーダーに対するすべてのチェックは、選択の後に、別の if() 節で行う必要があります。

そうなんです、できなかったんです。そのため、EUの1.11262でBid<openPriceのオーダーを出したのです。

つまり、if(OrderSelect())で注文の有無を確認し、埋め込みifで既にチャートシンボルと注文シンボル、建値などを 比較するということでしょうか?

 
.roman.:

そうなんです、できなかったんです。そのため、1.11262でeuにBid<openPriceのオーダーを出しました。

つまり、if(OrderSelect())で注文の有無を確認し、埋め込んだifでチャートシンボルと注文シンボル、建値などを比較すればよいのでしょうか?

はい、その通りです。最初にOrderSelect() を行い、次に残りのパラメータをチェックします。
 

踊らされても仕方ない。

注文の選択と シンボルとマジシャンのチェックを1行で書いても、3行に分けて書いても変わりません。新ビルドの変更に伴い、チェック条件は段階的にチェックされるようになり、最初の条件が満たされないと、次の条件はチェックされない。3行と同じです。1つ目の条件が満たされ、2つ目の条件が確認されます。そして、2つ目の条件も満たした場合にのみ、3つ目の条件の確認に進みます。

問題は、削除された部分のコードの中に、別の注文が選択されるユーザー関数の呼び出しがあることだと思われます。

 

もし、受注活動についての言及があれば、まずそこに気がついたはずです。でも、計算だけで、ユーザー機能は一つも使われていないんです。具体的に何が原因で、他の組から注文が選ば れるのかは不明です。それだけに、ドキュメントに書かれている「ソフトウェア環境」に戸惑い、すでにevillive さんの提案通りにコードを作り直し、タンバリンで踊る準備をしています。次の変態は、marketinfoを経由して、必要なペアのビッドアスクと強制的に比較することになります。


UPD.: 問題解決。実際に、独自のOrderSelectを使用するネストされた関数を発見しました。AlexeyVik さん、アイデアをありがとうございました。

 
ループの中で欲しいバーナンバーを見つけるが、ループの中で過去のバーナンバーも必要である、この問題をどのように簡潔に実装するか教えてください。ありがとうございます。
for(i=limit; i>=0; i--)
{
yesterday_weekday = TimeDayOfWeek(iTime(Symbol(),0,i-1))-TimeDayOfWeek(iTime(Symbol(),0,i));
if (yesterday_weekday ==1)
yesterday_time=iTime(Symbol(),0,i);
yesterday_shift=iBarShift(Symbol(),0,yesterday_time0);//последний бар 

}
 

EAを作 りました(仕事用ではなく、練習用です)

IF関数で両方のパラメータを設定する場合、1つずつ設定すれば、すべてうまくいきます。以下はそのコードです(また、すべての条件が一致しても、すでに買い注文が開いている場合は、次の買い注文が開かないようにするにはどうすればよいでしょうか)。

//+------------------------------------------------------------------+
//|                                                        новый.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()

  {
  
double PC = iClose ("EURUSD", PERIOD_H1, 0);  

double MA = NormalizeDouble (iMA ("EURUSD", PERIOD_H1, 12, 0, MODE_LWMA, PRICE_MEDIAN, 0), 4); 


if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point);

   
return (0);





   
  }
//+------------------------------------------------------------------+
 
inuboh:

EAを作りました(仕事用ではなく、練習用です)

両方を1つずつ設定すれば問題なく動作します。つまり、コードです(また、すでに買い注文が開いている場合、すべての条件が正しくても次の買い注文を開けないようにするにはどうすればよいでしょうか?)。

これがすべてのトラブルの原因というわけではなく、純粋に学術的な興味からです。なぜOnInit()とOnDeinit()を同時に行い、突然start()を行うのか?

そして、質問ですが、そのような比較のAsk==MAは、歴史上、非常に稀に実現することを強くお勧めしません。では、そんなPC-->MAという 表現には、どんな意味があるのだろうか。

買いの許可については、すべてのマーケットポジションをループし、シンボル、タイプ、マジックナンバーの指定された条件と比較し、求められるものが見つかった場合、カウンターを1つ増やします。そして、必要に応じて、このカウンターをチェックする。

そういうことなんです。

   _ExpertOrdersB=0;
   _ExpertOrdersS=0;

   for(int z=OrdersTotal()-1; z>=0; z --)
     {
      if(!OrderSelect(z,SELECT_BY_POS))
        {
         Print(". OrderSelect("+IntegerToString(z)+", SELECT_BY_POS ) FAIL!. Error #"+IntegerToString(GetLastError()));
        }
      if((OrderMagicNumber()==magic) && OrderSymbol()==_Symbol)
        {
          switch(OrderType())
           {
            default: break;
            case 0:
               _ExpertOrdersB++;
               break;
            case 1:
               _ExpertOrdersS++;
               break;
           }
        }
     }


if (_ExpertOrdersB < 1) //если нет покупок, то пытаемся купить, при условии, что:
if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point); 
 
evillive:

これがすべてのトラブルの原因というわけではありませんが、純粋に学術的な興味として、なぜOnInit()、OnDeinit()、そして突然start()を同時に行うのでしょうか?

そして、質問ですが、そのような比較のAsk==MAは、歴史上、非常に稀に実現することを強くお勧めしません。では、このPC-->MAという 表現は、どういう意味なのでしょうか。

買いの許可については、すべてのマーケットポジションをループし、シンボル、タイプ、マジックナンバーの指定された条件と比較し、求められるものが見つかった場合、カウンターを1つ増やします。そして、必要なところでカウンターを見ます。

癖でstart()を直した )

なぜAsk==MAが 稀なのか? 現在の買値が移動平均 線に触れることは稀なのか?

PC-->MAは、私の場合、直前の終値が移動平均線より高い場合です(他の方法は考えていません)。

そこで Ask==MA、次に PC-->MAと 一つずつIF機能を有効に すると うまくいくのですが、組み合わせるとうまく いきません!?

 
evillive:

これがすべてのトラブルの原因というわけではありませんが、純粋に学術的な興味として、なぜOnInit()、OnDeinit()、そして突然start()を同時に行うのでしょうか?

そして、質問ですが、そのような比較のAsk==MAは、歴史上、非常に稀に実現することを強くお勧めしません。では、そんなPC-->MAという 表現には、どんな意味があるのだろうか。

買いの許可については、すべてのマーケットポジションをループし、シンボル、タイプ、マジックナンバーの指定された条件と比較し、求められるものが見つかった場合、カウンターを1つ増やします。そして、必要に応じて、このカウンターをチェックする。

そういうものなんです。

私の理解では、PC-->MAは、PC-1>MAと同じです。