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

 

一つの保留注文がトリガーされたら、次に反対方向で別の保留 注文を出し、その量を倍にする。例えば、買いを出したら、買いよりも25ピップ低い位置にセルストップを置き、売りを出したら、25ピップ高い位置にバイストップを置くのである。保留中の注文の1つがトリガーされたら、トリガーされた注文と反対方向の保留中の注文を、最初のオープンオーダーの価格でもう1つ発注し、それもトリガーされたら、再びトリガーされたものと反対方向の保留中の注文を25ポイント以内に発注する、といった具合です。したがって、すべての買い注文は1つの価格でなければならず、すべての売り注文も1つの価格でなければならない。もし、ここに書いたことが理解できる人がいたら、コードで助けてください))

int A = 0;
if (OrdersTotal()==0)
   {
   A = 0;
   if ( Close[2] < Close[1])
      {
      OrderSend (Symbol(),OP_BUY,1,Ask,3,Ask-50*Point,Ask+25*Point,0,1);                 // первый вариант событий
      OrderSend (Symbol(),OP_SELLSTOP,2,Bid-25*Point,3,Bid+25*Point,Bid-50*Point,0,2);
      A=1;
      }
      
   if ( Close[2] > Close[1])
      {
      OrderSend (Symbol(),OP_SELL,1,Bid,3,Bid+50*Point,Bid-25*Point,0,1);               //второй вариант событий
      OrderSend (Symbol(),OP_BUYSTOP,2,Ask+25*Point,3,Ask-25*Point,Ask+50*Point,0,2);
      A=2;
      }
   }
//------------------------------------------------------------------------------------------------------------------+
OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера
int price = OrderOpenPrice();
//------------------------------------------------------------------------------------------------------------------+   
int sells = 0;                                                                                                                              
for (int B = 0; B < OrdersTotal(); B++)
   {
   OrderSelect (B,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sell
   if (OrderType() == OP_SELL) sells++;
   }
   
int buys = 0;                                                                                                                        
for (int b = 0; b < OrdersTotal(); b++)
   {
   OrderSelect (b,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buy 
   if (OrderType() == OP_BUY) buys++;
   }
int sellstops = 0;                                                                                                                              
for (int C = 0; C < OrdersTotal(); C++)
   {
   OrderSelect (C,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sellstop
   if (OrderType() == OP_SELL) sellstops++;
   }

int buystops = 0;                                                                                                                        
for (int c = 0; c < OrdersTotal(); c++)
   {
   OrderSelect (c,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buystop 
   if (OrderType() == OP_BUY) buystops++;
   }
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()==1)
   {                                               //удаление отложенного ордера..
   OrderDelete(2);                                 //..который остался после срабатываения tp и sl
   }  
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()>1 && A ==1)
   {
   if (sells == buys && buystops == 0)
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price,3,price-50*Point,price+25*Point,0,2);     //условия для первого варианта
      }
   if (buys > sells && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,2,price-28*Point,3,price+22*Point,price-53*Point,0,2);
      }
   }
   
if (OrdersTotal()>1 && A ==2)
   {
   if (sells == buys && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,1,price,3,price+50*Point,price-25*Point,0,2);     //условия для второго варианта
      }
   if (buys < sells && buystops == 0) 
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price+22*Point,3,price-28*Point,price+47*Point,0,2);
      }
   }
//-----------------------------------------------------------------------------------------------------------------+
   
   return(0);
   }
 
artmedia70:
これはインジケータからなのか、EAからなのか?違いがあるんです。一般的に、矢印を描画しないようにするには、インジケータで前の隣接するバーを確認し、それがゼロでないか空でない値を持つ場合、隣接するバーの矢印はすでに存在し、現在のバーバッファに値を入力する必要がないことを意味します。EA の場合、直前のバーが現在のバーと同じ方向のクロスファクトを既に含んでおり、矢印がそのファクトを既に示している場合、現在のバー上のクロスファクトは(存在すれば)登録せず、矢印も表示する必要はない。
あなたのコードについて、これ以上何も言うことはできません。もし周りにテレパスがいれば、あなたのコードをより深く理解することができるかもしれません ;)

これはインジケーターからです。2つのスリップの交点で、方向を指示します。 よくわからないのですが、すべてのバーでではなく、交差するときのみ指示が出ます。 ここから、前のバーで判断するのは無理がある...。教えてください、私たちはアレイを作っているんですよね?前のセルを確認するには?2つのバッファCrossUp[i]=Low[i] - Range*0.75; と、もう一つの バッファCr[i]=Low[i] + Range*0.75; (フォルダとコードをもう一度 書くのは面倒なので)です。
 
zaqwsx123:

一つの保留注文がトリガーされたら、次に反対方向で別の保留注文を出し、その量を倍にする。例えば、買いを出したら、買いよりも25ピップ低い位置にセルストップを置き、売りを出したら、25ピップ高い位置にバイストップを置くのである。保留中の注文の1つがトリガーされたら、トリガーされた注文と反対方向の保留中の注文を、最初のオープンオーダーの価格でもう1つ発注し、それもトリガーされたら、再びトリガーされたものと反対方向の保留中の注文を25ポイント以内に発注する、といった具合です。したがって、すべての買い注文は1つの価格でなければならず、すべての売り注文も1つの価格でなければならない。もし、私がここに書いたことを理解している人がいたら、コードで私を助けてください))

くだらないことばかり書いているが...。せめてこれだけは。

OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера

は、本当に順番が決まっているのでしょうか?本当にこの値段でいいんですか?注文にチケット==1があるのは確かですか?チケットで選択する場合、プールは 関係ないので、MODE_TRADESは不要です。チケットによる選択が成功したら、選択された注文のクローズタイムも確認する必要があります。Close time > 0の場合、その注文は決済されたか、削除された保留 注文であり、決済済み注文のリストから選択された状態です。

これ以上、コードを調べたくはない。まずは基本を知ることが大切かもしれませんね。チュートリアルとドキュメントを読んでください - これらはここの目立つ場所にあります。

 
artmedia70:


これ以上、コードを調べたくはないのですが...。


が目にとまりました))なぜ同じひよこが4羽なのか、サンプルはコメントにあるようなものではない。

if (OrderType() == OP_BUY) buystops++   //количество ордеров buystop

セルストップも 同様で、OP_BUYSTOPと OP_SELLSTOPが 必要です。

 
ALXIMIKS:


が目にとまりました))なぜ同じひよこが4羽なのか、サンプルはコメントにあるようなものではない。

セルストップと同様 OP_BUYSTOPと OP_SELLSTOPが 必要です。

そこまではいかなかった。コードを見て、間違いを説明する必要はなく、自分で読めるような基本から教えればいいんだとわかったら......。したくないんです。有償で教えることはあっても、コードの中のエラーを見つけるのを手伝うだけで、エラーの中にコードがあるわけではない、というところはダメです。
 
Zolotai:

これはインジケーターからです。2枚のスライドが交わることで、方向性を示す。 交差するときだけ、すべてのバーでではなく、方向を示してくれるのが、よくわからない。 ここからは、前のバーから判断することはできませんが...。教えてください、私たちはアレイを作っているんですよね?前のセルを確認するには?2つのバッファがあります: 1つはCrossUp[i]=Low[i] - Range*0.75; そしてもう1つは、例えば Cr[i]=Low[i] + Range*0.75;(I just not want to search through folders and code again) です。
ソースデータはありません。こちらから 検索してみてください。
 
BUY_STOP注文がありますが、実行前に削除されました。




コードを確認する。
            for(int cnt_1=OrdersHistoryTotal()-1; cnt_1>=0; cnt_1--) {
               if(OrderSelect(cnt_1, SELECT_BY_POS, MODE_HISTORY)==true ) {
                  if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
                     Print("OrderProfit()=",OrderProfit(), "   OrderCloseTime()=",TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS), "   OrderType()=",OrderType(), "   OrderTicket()=",OrderTicket(), "   OrderClosePrice()=",OrderClosePrice(), "   OrderOpenPrice()=",OrderOpenPrice() );
                  } // if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
               }
            } // for(int cnt_1=0; cnt_1<OrdersHistoryTotal(); cnt_1++) {

結果を表す文字列。
OrderProfit()=0   OrderCloseTime()=2001.01.26 06:15:00   OrderType()=4   OrderTicket()=24   OrderClosePrice()=0.9237   OrderOpenPrice()=0.9419

1, OrderType=4 - "4 "はOP_SELLLIMITですよね?
OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - OrderClosePrice() の値が OrderOpenPrice() と等しくないのはどこから来たのでしょうか?

 
chief2000:

BUY_STOP注文がありますが、実行前に削除されました。




コードを確認する。

結果を表す文字列。

1, OrderType=4 - "4 "はOP_SELLLIMITですよね?
2.OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - OrderClosePrice() の値が OrderOpenPrice() と等しくないのはどこから来たのでしょうか?

テスターでは、可視化モードでは、すべてのティックの上に、ステップバイステップモード(一時停止でF12)で、その除去の瞬間を見つけて、現在の価格を見て、多分そこに犬がそこに隠されている?
 
artmedia70:
と可視化モードのテスターで、すべてのティックではい、ステップモード(一時停止でF12)でその除去の瞬間を見つけ、現在の価格を参照してください、多分それは犬が埋め込まれている場所です? 。


BINGO!知りませんでしたが、すべてお書きの通り、つまりこの場合の終値は、注文を削除した時点の値です。ありがとうございました。
 

よく、関数の中でこのように変数を宣言することがあります。

int err = GetLastError();

さらに内部では、ある条件ですでにエラーがあるかどうかを確認するために呼び出しています。まあ、私だけでなく、私が遭遇したコードの多くの場所でそうなのですが。言ってみれば、典型的なシチュエーションですね。今日思ったのは、エラー制御をしたい各関数で毎回同じ変数を宣言するのは論理的ではない、ということです。よく考えたら、一度グローバルに宣言して、initで初期化する方が簡単だという結論に達しました。こんな感じです。

// Объявили на глобальном уровне
int err;

// Инициируем данную переменную:
int init()
{
    err = GetLastError();
}

そしてさらに、ユーザー関数でerr変数を呼び出す必要があるとき、すでに値を持っていることを知っていることです。実は、GetLastError() 最後に発生したエラーの コードを出力するので、エラーコードを出力する役割を持つ各計算の最後に、この変数errを各関数で呼び出し、GetLastError()を呼べば、すべて正しくなりますよね?

しかし、この変数を何らかの関数の最後で(コード実行の連鎖をたどって)呼ばないと、リセットされず、前の実行でエラーがあったが、現在の実行ではエラーがなく、最後にエラーコードが返された場合、間違った実行をすることになる.........。そして、それをリセットするためには、この関数GetLastError()を呼び出す必要があります。つまり、ここではすべてが呼び出されたかどうかにかかっているのです。どこまでも続くと確信が持てないなら、毎回再保険をかけてリセットしたほうが楽でしょう?

理由: