2つのポジションを独立して制御するトロールプロからアドバイスが欲しいのですが、どのように実装すればよいでしょうか? - ページ 6

 
charony:

そんな感じです。


ただ、トロールの発動基準には興味がない

各オープンポジションを他と区別して処理するトロールが必要です

このトレイルは、プラスになっているポジションのみ探索を開始し、マイナスになっているポジションではストップを移動させません。

"両方のポジションに50pipsのトロールを設定することが可能です。

が、同時に閉じることはない。

両ポジションとも50pipsのトローリング"

両方がプラスになった場合のみクローズし、一方がプラス、他方がマイナスになった場合は、プラスの方のみストップが動きます。

 
PozitiF:

全ページを読んだわけではありませんが、大筋は理解できたと思います。

https://www.mql5.com/ru/articles/1390 ここで、注文で配列を作り、注文を作るときにどこかからマジックを取る。例えばEAの入力パラメータにマジック=1と書いておけば、次のオープンオーダーで1ずつ値を増やしていくことができる。

端末がクラッシュしても、アレイを復元することができます。

私が書いた前のページでMagicがパラメータとして受け取るtrull。



配列が違うんです、intとdoubleを同じ配列に入れちゃダメなんです。
 
charony:

配列がおかしい、intとdoubleを同じ配列に入れるのはダメだ。
ドットの前に整数を置くだけなので、可能です。
 
PozitiF:
ドットの前に整数を置くだけなので、可能です。


二重価格 EUR/USD 1.3915 int 1 で。

int sell = 1, in double sell = 1.0

そして、プログラムが動作しない理由を探してみてください。

とか、最悪「コリャマージン」おじさんがやってきたりして。

 

そして、なぜintに価格を入れるかというと、そんなことはまったく書いていないんです。

int型の数値をdouble型の変数に入れると書きました。

をdoubleからintに戻すと、すべて再び動作するようになります)https://www.mql5.com/ru/forum/136406

 

int MN=TimeCurrent(); を入れて、OrderSend(Symbol(),OP_BUY,Lots_New,Ask,2,0,NULL,MN,0,Green)としました。

註:各オーダーにはマジックが割り当てられています。

選択後のトロールで

int Tip=OrderType();

if(OrderSymbol()!=Symbol()||Tip>1)continue。

if(OrderMagicNumber()==MN)

これから挑戦してみようと思います。

 

そんなことはない、何か他の問題があるに違いない、今はトロールの話をしているんだ。

探してみます。

 
PozitiF:

それに、なぜ価格をintにするのか、私はそんなことは一切書いていないし、提案もしていない。

int型の数値をdouble型の変数に入れると書きました。

をdoubleからintに戻すと、すべてうまくいく)https://www.mql5.com/ru/forum/136406

二重価格 EUR/USD 1.3915 を int 1 に、そして再び double 戻す1.0 になります。

二重価格 EUR/USD 1,3915 ==========> 二重 1.0

どこで笑う?



int 1------> double 1.0 ------> int 1 ここでも多分動くと思うが、カッコ悪い。

 
charony:

そんなことはない、何か他の問題があるに違いない、今はトロールの話をしているんだ。

探してみます。

Trallは100%動作しており、私のほぼすべてのEAで動作しています。

int Trall = 50;

int MN= TimeCurrent();

OrderSend(Symbol(),OP_BUY,Lots_New,Ask,2,0,0,NULL,MN,0,Green);

int Tip=OrderType();

if(OrderSymbol()!=Symbol()||Tip>1)continue;
for(int i = 0; i<OrderTotals(); i++){
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true){
      if(OrderMagicNumber()==MN) TrailingStop(Trall, 5, MN);
   }
}

トロールするはずです。

 
//+-----------------------------trailingstop----------------------------------------------+
 total=OrdersTotal();
    for(int n=0;n<total;n++)
     {
      if(OrderSelect(n, SELECT_BY_POS, MODE_TRADES) == true)
         { 
         int Tip=OrderType();                  
         if(OrderSymbol()==Symbol()&&OrderType()==Tip)
            {
                MN = OrderMagicNumber();
                TrailingStop(level_ts, level_step , MN);
            } 
         }    
      }
 
  

   
   return;                             // exit start()
  }
//+-----------------------------start end----------------------------------------------+

void TrailingStop(int level_ts,int level_step , int MN) 
{
   int ot, err, quantity_orders, cx;
   bool fm;
   double op, as, bd, pt, sl, tp, ut;
//----
   quantity_orders = OrdersTotal();
   if(quantity_orders >= 0) {
      for(cx = 0; cx < quantity_orders; cx++) {
         if(!OrderSelect(cx, SELECT_BY_POS, MODE_TRADES)) {
            Print("Error: SimpleTrailing(), OrderSelect: " + cx + ". Îøèáêà: " + GetLastError());
         }
         if (OrderMagicNumber()==MN ) 
         {   
            pt = MarketInfo(OrderSymbol(), MODE_POINT);
            bd = MarketInfo(OrderSymbol(), MODE_BID);
            as = MarketInfo(OrderSymbol(), MODE_ASK);
            op = OrderOpenPrice();
            ot = OrderType();
            sl = OrderStopLoss();
            tp = OrderTakeProfit();
            ut = level_ts + level_step;
         
            if(ot == OP_BUY) {
               if(sl == 0 || sl < op) {                              
                  if(op <  (bd - ut * pt)) {                         
                     sl = bd - level_ts * pt;
                  }
               }
               else {
                  if(sl < (bd - ut * pt) && bd > (op + ut * pt)) {
                     sl = bd - level_ts * pt;
                  }
               }
            }
            if(ot == OP_SELL) {
               if(sl == 0 || sl > op) {
                  if(op > (as + ut * pt)) {
                     sl = as + level_ts * pt;
                  }
               }
               else {
                  if(sl > (as + ut * pt) && as < (op - ut * pt)) {
                     sl = as + level_ts * pt;
                  }
               }
            }
            if (sl != OrderStopLoss()) {
               op = NormalizeDouble(op, Digits);
               tp = NormalizeDouble(tp, Digits);
               sl = NormalizeDouble(sl, Digits);
               fm = OrderModify(OrderTicket(), op, sl, tp, 0, CLR_NONE);
               
            }
         }
      }
   }
}

//+-----------------------------trailingstop end----------------------------------------------+

コードを挿入 したら、トロールが動作するようになりました。

が、問題は解決しない。

理由: