[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 842

 
オープニングと同じブロックにオーダーモディフィケーションがあり、その条件がオーダーなしとなっていますね。注文を出したばかりで、すぐにそれを修正しようとすることがわかりますが、5pipsの利益はどこから出てくるのでしょうか?
 

皆さん、こんにちは!最近、移動平均線に興味を持ちました。移動平均線と取引条件の組み合わせがいくつか見つかり、自分のTSが儲かっているかどうか、チェックし、何かあれば最適化することにしました。しかし、私のExpert Advisorは、テスト中にディールを開くことができませんでした。私は夜通しで解決策を考え、親愛なるプログラマーの皆さんにお願いすることにしました。EAがどのように動作するかを理解するために、私は簡単に私のTSを説明します:EMA(13)とEMA(55)のチャート上で、バーがEMA(13)を横切り、次のすべてのバーがEMA(13)の上/下にあった場合、MA(13)で価格に触れたときに我々は以前のバー(クロス後+少なくとも9と23以下)の方向に位置を開く。利食い60ポイント、ストップロス=EMA(55)+マイナス5ポイント。実はこれが戦略のすべてなんです。より分かりやすくするために、例を掲載しました。

そして、これがExpert Advisorのコードです。

//+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot=0.1;
extern int FastMA=13;         //Быстрая МА
extern int SlowMA=54;         //МедленнаяМА
extern int TP=60;             //Тейк профит
extern int MinBars=8;         //Минимальное кол-во баров вне МА
extern int MaxBars=25;        //Максимальное кол-во баров вне МА
extern int slippage=3;        //Слипадж
extern int Magic=347586;      //Магическое число
extern int Space=10;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return (0);
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA(0);
   double SMA=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
   for (int x=1;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen(0,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen(1,SMA);                             //...или на продажу
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for(int i=1;i<=OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(true);
         }
      else
         Print("OrderSelect() вернул ошибку - ",GetLastError());
          
      }
    return(false);
   }

void OrdOpen(int type,double SO)                               //Функция открытия позиций
   {
   if (type==0) 
      {
      if (OrderSend(Symbol(),0,Lot,Ask,slippage,SO-Space*Point,Ask+TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   else 
      {
      if (OrderSend(Symbol(),0,Lot,Bid,slippage,SO+Space*Point,Bid-TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   return;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if (OrderSelect(Magic,SELECT_BY_TICKET)==true)
      {
      double SL=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
      if (Bid<iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0)) SL=SL+Space*Point;
      else SL=SL-Space*Point;
      if (OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue)==true) return;
      else Print("OrderModify() вернул ошибку - ",GetLastError());
      }
   return;
   }
double MA(int m)                                                  //Функция возвращающая значение МА
   {
   return(iMA(NULL,0,FastMA,m,MODE_EMA,PRICE_CLOSE,0));
   }

どなたかお手伝いいただける方がいらっしゃいましたら、お願いします。EA本体もお渡しします

ファイル:
dwm.mq4  5 kb
 

ポジションを 開く、変える、閉じるなど、多くの機能を1つのフォーサイクルに集めることができます。

ここでは、簡単な例をご紹介します。

            bool Ans=OrderModify(Ticket,Price,SL,TP,0);
            if (Ans==true) {
               Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
            }

- 質問:ここでは「return」ではなく「break」を使うのが正しいのでしょうか?違いはあるのでしょうか?

 
chief2000:

ポジションを開く、変える、閉じるなど、多くの機能を1つのフォーサイクルに集めることができます。

ここでは、簡単な例をご紹介します。

- 質問:ここでは「return」ではなく「break」を使うのが正しいのでしょうか?違いはあるのでしょうか?

https://docs.mql4.com/ru/basis/operators/break より
"break 文は、最も近いネストの外部switch文、while文、for文の実行を停止します。制御は、終了したものに続くオペレータに与えられる。"

https://docs.mql4.com/ru/basis/operators/return より
"return 文は、現在の関数を終了させ、呼び出し元のプログラムに制御を戻す。"

答え:ここでは "break "を使うのが正しいです。

 
abolk:

https://docs.mql4.com/ru/basis/operators/break より
"break 演算子は、最も近いネストの外部スイッチ、whileまたはfor演算子の実行を終了させます。制御は終了したものに続くオペレータに移る。"

https://docs.mql4.com/ru/basis/operators/return より
"return 演算子は、現在の関数を終了させ、呼び出し元のプログラムに制御を戻す。"

答え:ここでは "break "を使うのが正しいです。

実は自分もbreakを使っているのですが、returnは刻み替えの意味だと思っていました(breakはそうではない)。

実際には、オーダーが変わるまでは、ティックの変化があるので、テスターが正しくシミュレーションをするためには

の場合、returnを使用する必要があります。そうだろ?

私の勘違いかもしれませんが、理解したいと思います。

 
chief2000:

実は自分もbreakを使っているのですが、returnは刻みの変更という意味 だと思っていました(breakはそうではありませんが)。

実際にはオーダーが変わるまではティックチェンジが発生するため、テスターはリターンで正しくシミュレートする必要があります

の場合、returnを使用する必要があります。そうだろ?

私の勘違いかもしれませんが、理解したいのです。

ドキュメントで読んでみよう。"return 演算子は、現在の関数の 実行を停止し、呼び出し元のプログラムに制御を戻す。"

現在のstart()関数の 場合、もう一度ドキュメントを読んでください。

https://docs.mql4.com/ru/runtime/start
"新しい相場が来ると、付属のExpert Advisorやカスタムインジケータの関数start()が実行されます。新しい気配値の到着時に、前の気配値で実行されていた関数 start() が実行された場合、入力された気配値は Expert Advisor によって無視されます。プログラム実行中に来た新しい引用符は、次のstart()関数の実行が終了するまで、すべて無視されます。その後、関数 start() は、次の新しい相場が到着した後にのみ起動されます。

 
abolk:

ドキュメントで読む。"return 文は、現在の関数を 終了させ、呼び出し元のプログラムに制御を戻す。"

現在の関数がstart() であれば、もう一度ドキュメントを読んでみてください。

https://docs.mql4.com/ru/runtime/start
"新しい相場が来ると、付属のExpert Advisorとカスタムインジケータに対して関数start()が実行されます。新しい気配値の到着時に、前の気配値で実行されていた関数 start() が実行された場合、入力された気配値は Expert Advisor によって無視されます。プログラム実行中に来た新しい引用符は、次のstart()関数の実行が終了するまで、すべて無視されます。その後、関数 start() は、次の新しい相場が到着した後にのみ起動されます。

自分の言葉で表現してほしい。意味がわからないんですけど。

テスターでは、forがbreakで終了し、その後に他の関数が続くと、同じtickで実行されます。しかし実際には、この間(注文の変更中)に数ティックが変更されることがあります。だから、リターンの方が現実的だと思うんです。そうでしょう?

 
chief2000:

自分の言葉で表現してほしかった。意味がわからないんですけど。

forがbreakで終了し、その後に他の関数が続く場合、同じtickで実行されます。しかし実際には、この間(注文の変更中)に数ティックが変更されることがあります。だから、リターンの方が現実的だと思うんです。そうでしょう?


start()はtickの先頭から始まり、次のtickの先頭までに終了しない場合があります。

breakはforを終了させ、returnは関数を終了させる。forの後に演算子がない場合、このアルゴリズムではforとreturnを使うことに違いはない。

しかし、それぞれのオペレーターには目的があります。そして、意図しないオペレーターの使用は、弾の入っていない散弾銃のようなものです。

繰り返しになりますが、forループのアルゴリズムにおいて、何らかの理由で関数の実行を継続する必要がない場合、returnを使用することができます。

つまり、アルゴリズムがループの途中でブレークを必要とする場合、ループの後で関数がまだ終了していても、ブレークが使用されるのである。

 
abolk:


start() は tick の先頭で処理を開始し、次の tick の先頭までに処理が終わらない場合があります。

break は for を完了し、return は関数を完了する。forの後に演算子がない場合、このアルゴリズムではforを使ってもreturnを使っても差はない。

しかし、それぞれのオペレーターには目的があります。そして、意図しないオペレーターの使用は、弾の入っていない散弾銃のようなものです。

繰り返しになりますが、forループのアルゴリズムにおいて、何らかの理由で関数の実行を継続する必要がない場合、returnを使用することができます。

つまり、アルゴリズムがループを抜けることを要求している場合は、たとえループの後に関数が終了したとしても、breakを入れるのです。

ふと思ったのですが、これらはすべてテスターのみを対象としたものなので、(必要に応じて)次のようにすればいいのではないでしょうか。

if(IsTesting()==true   ||   IsOptimization()==true) {
   return;
}

break;

ありがとうございました。

 
chief2000:

アイデアが浮かびました。これはテスターのために始めただけなので、(適切なところでは)次のようにすることができます。

ありがとうございました。


よろしい