MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1245

 
Denis Diakonov:

はなく、例えば、まずケース1を通し、次にケース2を通す、など。

ケースは、注文の開始を実行します。

注文が複数個所で開かれている。このコードできっちり考えないといけないし、難しいですね。

 
EAのOnTickの中にそれなりの時間がかかるサイクルがある場合、それは完全に実行されますか、それとも新しいティックの到着がそれをすべて中断させますか?
 
Alexey Viktorov:

オープニングは1つだけではありません。このようなコードでは、自分の考えを正確に伝える必要があり、それが難しいのです。

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
EAのOnTickの中にそれなりの時間がかかるループがある場合、それが完全に実行されるのか、それとも新しいティックの到着がそのすべてを中断させるのか。

私の場合、ループが開始され、すべての注文が開始されるわけではなく、いくつかは2回開始され、いくつかはスキップされます。新しいティックが開始のトリガーとなり、コードは実行を中断して再び動作を開始することは理解しています。

 
Denis Diakonov:

新しいティックが開始のトリガーとなり、コードが実行を一時停止し、再び実行を開始することは理解しています。

を作らないでください。

ヘルプを読むと、EAで複雑な計算をした場合、新しいティックがスキップされることが明確に書かれています。

イベント処理関数に関する 記事のどこか、あるいは取引操作、RefreshRatesのどこか

コードのロジックエラーを探す


HH: switch() - 複雑な論理条件にはcaseを使用せず、if() elseの組み合わせが良い - そうすれば、より曖昧さのない論理分岐が得られる。

 
Igor Makanu:

は作らないでください。

ヘルプを読むと、EAで複雑な計算をした場合、新しいtickはスキップされるとはっきり書いてあります。

イベント処理関数に関する 記事のどこか、あるいは取引操作、RefreshRatesのどこか

コードのロジックエラーを探す


SZY: switch() - 複雑な論理条件にはcaseを使用せず、if() elseのより良い組み合わせで、より曖昧さのない論理分岐を得ることができます。

そうなんです、ありがとうございます。

 
Denis Diakonov:

なぜここにスイッチを追加したのか、まったくもって疑問です。取引の方向と 必要な開口数を関数に取り込み、ループの中で指定された数だけ開口する方が簡単です。

だから、あなたの論理を理解することは、私の頭には無理だと言っているのです。なぜ、こんなにも混乱するのか?

 
Alexey Viktorov:

なぜここにスイッチを追加したのか、まったくもって疑問です。取引の方向と 必要な開口数を関数に取り込み、ループの中で指定された数だけ開口する方が簡単です。

だから、あなたの論理を理解することは、私の頭には無理だと言っているのです。なぜ、こんなにも混乱するのか?

まあ、私のコードが増えただけなので、もっと簡単だと思ったのですが。

実際、1つの関数の実行中に何度でもcaseを呼び出す機会があれば、よりシンプルでコンパクトになります。

似たような案件をループで開く必要はなく、シグナル発生時に異なるシンボルに対して同時に(可能な限り)開かれるんだ。

ケース 1 - audusd の購入

ケース 5 - 英国ポンド買い

ケース9 - EURUSD買い

など

最初のケースでは、1枚にケース、2枚目に分析を書いていますが、それらが相互に作用すると、500行になります。

2つ目の方法は、関数内部で特定の順序で解析を開始する必要があり、総行数が1200行以上となり、プログラムの実行速度に影響します。

 

助けてください!お願いしますExpert Advisor は、偏差を動的に計算する Envelopes インジケータを使用しています。しかし、チャート上に表示されると、以前のすべてのバーにおけるインジケータの偏差のすべてのダイナミクスが表示されます。

ダイナミックエンベロープ

1.インジケータを正しく描画させる方法はありますか?つまり、そのインジケータをそのバー上にのみ、その偏差で描画するのです。

2.Expert Advisorのインジケータの描画を無効にし、計算のみを残すにはどうすればよいですか?エキスパート設定でインジケータの描画を有効・無効にしたいのですが......。)

 
Denis Diakonov:

まあ、結局、もっとシンプルにできると思っていたのに、私のコードは大きくなるばかりでした。

とにかく、1つの関数の実行中に何度でもcaseを呼び出すことができれば、もっと簡単で、コードもコンパクトになるはずです。

似たような案件をループで開く必要はなく、シグナル発生時に異なるシンボルに対して同時に(可能な限り)開かれるんだ。

ケース 1 - audusd の購入

ケース 5 - 英国ポンド買い

ケース9 - EURUSD買い

など

最初のケースでは、1枚にケースを、2枚目に分析を書いていますが、これらが相互に作用すると500行になります。

2つ目の方法は、関数内で特定の順序の開口部を分析することを意味し、おむすびに引き伸ばされ、総行数は1200 以上になり、最終的にプログラムの実行速度に影響を与える。

何をもって何行も打ち込んでいるんだ?これは私の最後のEAの一つで、FORTSの証券のセットで動作します。

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

多くの証券が上場されれば、それだけ多くの取引が行われることになります。そして、このEAは、2つの取引時間枠を制御し、トレーリングを行い、もちろん分析も行い、わずか326行です。

switchを使用する場合、各バリアントでポジション開閉を追加する必要はありません。シンボル名、取引操作の 種類を指定するだけで十分です。

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

しかし、私見では、ユーザー定義関数ですべてを包む方が良いと思います。

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }