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

 
Ekburg:

このコードの何が問題なのか、教えてください。トレーリングストップなのですが、テストすると修正時にエラー1が発生します。なぜ注文が変更されないのか?

このエラーを修正しているとき(今のところ失敗しています)、Expert Advisorのメインコードをprint関数にコンパイルすると、反転したカンマが必要だと言ってエラーを返すようになりましたが、そこにあるものはすべて正しく、このエラーを修正するには、反転したカンマを取り除いて新たに入れなければなりません......。

bool trailingstop()
{
if ((注文マジックナンバー()==11111)==true)
{
Print("買いポジションを維持");
while(OrderCloseTime()==0)とする。
{
if ((ビッド-オーダーストップロス())>(ストップレベル*ポイント))
{
if (オーダーモディファイ(オーダーチケット(),オーダーオープン価格(),ND(ビッドストップレベル*ポイント),0,0))
Print("注文番号 ",OrderTicket()," とマジックナンバー ",OrderMagicNumber()," の注文のストップロスが ",OrderStopLoss()" に正常に変更されました)。
else Print("注文番号 ",OrderTicket()," とマジックナンバー ",OrderMagicNumber()," を持つ注文のストップロス・レベル。Error ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("注文番号 ",OrderTicket()," とマジックナンバー ",OrderMagicNumber()," の注文が価格 ",OrderClosePrice()," で利益/損失 ",OrderProfit()) で決済されました)
return(true)です。
}
}
さもなくば
{
if ((注文マジックナンバー()==22222)==true)
{
Print((売りポジション));
while(OrderCloseTime()==0)とする。
{
if ((OrderStopLoss()-Ask)>(StopLevel*Point))
{
if (オーダーモディファイ(オーダーチケット(),オーダーオープンプライス(),ND(Ask+ストップレベル*ポイント),0,0))
Print("注文番号 ",OrderTicket()," とマジックナンバー ",OrderMagicNumber()," の注文のストップロスが ",OrderStopLoss()" に正常に変更されました)。
else Print("注文番号 ",OrderTicket()," とマジックナンバー ",OrderMagicNumber()," を持つ注文のストップロス・レベル。Error ",GetLastError());
}
}
if (OrderCloseTime()>0)
{
Print("注文番号 ",OrderTicket()," とマジックナンバー ",OrderMagicNumber()," の注文が価格 ",OrderClosePrice()," で利益/損失 ",OrderProfit()) で決済されました)
return(true)です。
}
}
else return(false);
}
}


OrderModify()の前に、変更パラメータを挿入してください(もしオーダーstoploopが stoploop, (ND(Bid-StopLevel*Point)or ND(Ask+StopLevel*Point)) と等しくない場合はOrderModify()、それ以外はリターンします)。
 
rigonich:

エラー1はエラーではありません。 これは注文がすでに修正されていることを意味します。 OrderModify()の前に修正パラメータを挿入チェックします(注文のストップロスがストップロスと等しくない場合、ND(Bid-StopLevel*ポイント)またはND(Ask+StopLevel*ポイント)、次にOrderModify()、それ以外はリターンします)。


このチェックは上記:if ((Bid-OrderStopLoss()>(StopLevel*Point)), or I got you wrong.

そして、急激な動きでテストしてみたところ、目視でも、注文のストップロスと表現が等しくないことがよくわかります

 
Usual_Trader:


一目で、私は注文を閉じるの関数で何を参照してください、あなたはチケットで注文を選択する必要がありますOrderSelect(チケット、SELECT_BY_TICKET)、ロットの数は、それが毎回再計算されるので、変数LTSを示すのではなく、使用OrderLots()そしてもう一つは、あなたがそれぞれ、0バーで作業を継続、1バー上の基準が消えることが、あなたの注文はあなたが望む場所を開くことができない場合があります。インジケーターパラメーターのバー0を1に、1を2に置き換えます。



また、0バーで注文を出したいのですが、追加条件が必要なようです。現在のバーで注文を出した後、バーが閉じるまで何もしなければならないのですが、その方法がわかりません(時系列配列を使うのでしょうか)アドバイスをお願いします。
ファイル:
 
Ekburg:


このチェックは、if ((Bid-OrderStopLoss())>(StopLevel*Point)) の上にありますが、それとも私が誤解している のでしょうか?

注文のストップロスと式が等しくないことがよくわかる急激な動きで確認しました


問題は以下の通りです。この関数ではOrderSelect()を使用していないので、ループ内のどこかで注文の検索を使用する必要があります。このループが、ゼロのオーダーから最後のオーダーまで検索を整理する場合、最初のオーダーの修正後、または、何らかのオーダーが既に見つかっている場合、次にOrderSelect() が呼ばれたとき、オーダーの順序が変わり、この関数は既に修正されたオーダーを選択するかもしれない。したがって、注文の StopLoss の値が OrderModify() 関数に送信した値と等しいかどうかを確認する必要があります。

if(ND(Bid-StopLevel*Point)==OrderStopLoss())return(true);
 

abeiks

しばらくの間 最後の2つの 買いポジションだけを 閉じるために、 買い クローズ ブロックを やり直すことを 試して いますが、失敗して います ブロックの やり直しの方法を教えてください。

//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void Close_2buy()
   {
   bool     result;
   int      Count=2,Ticket=-1,error;
   datetime time=0;
   while(Count>0)
      {
      for (int f=OrdersTotal()-1; f>=0; f--) // 
         {
         OrderSelect(f, SELECT_BY_POS);
         if (OrderSymbol()==Symbol() &&(OrderMagicNumber()==magic ) 
         && (OrderType() == OP_BUY )) 
            {
            if(OrderOpenTime()>time)
               {
               time=OrderOpenTime();Ticket=OrderTicket();
            }
         }
      }
      if(OrderSelect(Ticket,SELECT_BY_TICKET)==True);
         {
         result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),0,CLR_NONE);
         if(result!=TRUE){error=GetLastError();Print("LastError = ", error);}
      }
      else{error=GetLastError();Print("LastError = ", error);} 
      Ticket=-1;time=0;Count--;
   }
   return;
} 
 
ametist444:

こんにちは。

このウィンドウを表示するには、どのファイルをダウンロードし、mt4のどこにインストールする必要があるか教えてください。

テスト対象商品の異なるタイムフレームでシミュレーションを 行う方法がわかりません。

日足チャート、4時間足、1時間足の3つだけを表示させたい

日足、4時間足、1時間足の3つのチャートを見たいのですが、一晩中やってもうまくいきません!助けてください。



ビジュアルモードでEAをテストするときに、(ビジュアル)のようなウィンドウが開く。


 
peshihod:

StopLossの種類は?

言い方が悪かったかな :(

注文を開始するためのアルゴリズムがあります。

最後の注文が何らかの形でクローズされた場合、次の注文を別の方向で(条件が揃った時に)開くようにして欲しい。

すべてうまくいくのですが、例えば売りの場合、ストップロスで閉じていて、この方向で売りを開くという条件が揃うと、オープンが続いてしまいます。必要なのは、買うための条件を待つことだ。

つまり、最後に閉じた注文をチェックする必要があり、それが始値の注文と重ならないようにする(買い-売り-買い-売り交互)。注文か信号待ちのどちらか1つだけが動作しています。

OrdersHistoryTotal()を使うべきなのだろうということは理解できましたが、動作するEAではどのように見えるのでしょうか?

ありがとうございます。

 
delf:

注文を開始するためのアルゴリズムがあります。

条件が整えば)次の注文を違う方向で開けるために、最後の注文のどんなバリエーションも必要なのです。

つまり、最後に閉じた注文と開いた注文が重ならないようにチェックする必要がある(買い-売り-買い-売り交互)。開店を待っている注文や信号は1つだけです。

この交代は、どんな場合でも常に行われ、常に一つの秩序しかないのでしょうか?

そうすると、条件に注文 数の制御を加えることが容易になります。

if(OrdersTotal()==0)
{
	if(OldOrder==OrderBuy)
		{
		...
		}
	else
		{
		...
		}
}
 
rigonich:


問題は以下の通りです。この関数ではOrderSelect()を使っていないので、ループ内のどこかで注文を検索して使っているようです。このループがゼロのオーダーから最後のオーダーまで検索を整理する場合、最初のオーダーの修正後、またはこのティックで既に何らかのオーダーが埋まっている場合、次にOrderSelect() が呼ばれたとき、オーダーの順序が変わり、この関数は既に修正されたオーダーを選択することができる。したがって、注文の StopLoss の値が OrderModify() 関数に送信した値と等しいかどうかを確認する必要があります。


いや、ポジションの注文の1つがクローズされたときに注文番号を変更する問題は解決しました。そこにエラーがあるのではないかと思って何度も確認しましたが、そこはすべてOKで、必要な注文が選択され、それに対してストップロスが正しく計算されているのに、注文が修正されることを望んでいない......ということです。
 

delf:

最後の注文はいずれかの方向で決済し、次の注文は他の方向で開く必要があります(それぞれ条件を満たした場合)。

より厳格なオプション

#define OrderBuy  0
#define OrderSell 1
int NewOrder;
int RezultatSend; 

int start()
{
... 
... 

if(OrdersTotal()==0)
{
if(NewOrder==OrderBuy)
   {
   if(/*Условие для Buy*/)
      { RezultatSend=OrderSend(/*...buy*/);     //Ставим Buy
        if(RezultatSend!=-1)NewOrder=OrderSell; //Если ставка прошла
      }
   }
 else
   {
   if(/*Условие для Sell*/)
      { RezultatSend=OrderSend(/*...*/);       //Ставим Sell
        if(RezultatSend!=-1)NewOrder=OrderBuy; //Если ставка прошла
      }
   }
}

...
...

}