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

 
MrBrooklin #:

Alexeyさん、ありがとうございます!まずはこのスレッドで回答を待ちますが、何もなければエラー、バグ、質問の スレッドに移動します。

敬具 ウラジミール

このスレッドでは、開発者からの回答は得られないでしょう。もし、エラーを発見し、それが本当にエラーであることを確認したら、アレクセイが声優を務めるブランチに報告してください。私たちも人間であり、時間がないこともあります。

 
Artyom Trishkin #:

このスレッドでは、開発者からの回答は得られそうにありません。もしエラーを見つけたら、それが本当にエラーであることを確認し、Alexeyのブランチに報告してください。この際、モデレーターに行動を期待する必要はありません。私たちも人間であり、時間がないのです。

アルテムさん、こんにちは。

すべてがクリアになる。

敬具 ウラジミール

 

こんにちは!!!!

ここにグリッドアドバイザーのための2つの関数である最初の関数は、アカウント負け注文の部分的な閉鎖を考慮して、利益の計算です。

//+----------------------------------------------------------------------------+
//| Калькуляция сетки ордеров                                                  |
//+----------------------------------------------------------------------------+
bool CalculiteProfit()
  {
   double oProfit=0,oLoss=0,percent;
   int i;
   nOrd=0;
   for(i = OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic || OrderType()>OP_SELL)
         continue;
      if(OrderProfit()>=0)
         oProfit += OrderProfit();
      else
        {
         oLoss+=OrderProfit();
         Ord_ticket[nOrd]=OrderTicket();
         Ord_lot[nOrd]=OrderLots();
         nOrd++;
        }
     }
   oLoss = MathAbs(oLoss+GetOrderSwap()+GetOrderCommission());
   if(oLoss>0)
      percent=oProfit/oLoss*100;
   else
      percent=100;
   if(percent<MinPercentForClose) //MinPercentForClose переменная из настроек 
      return(false);
   for(i=0; i<nOrd; i++)
     {
      Ord_lot[i]=(MathCeil((Ord_lot[i]*RowLots)*percent)/100)/RowLots;
     }
   return(true);
  }

2つ目の機能は、負け注文を部分的に決済するクロージングオーダーです。

//+----------------------------------------------------------------------------+
//| Закрытие сетки ордеров при заданной команде с учетом части ордеров         |
//+----------------------------------------------------------------------------+
void ClosseAll()
  {
   int i,j,tkt;

   for(i = OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic)
         continue;
      tkt=OrderTicket();
      RefreshRates();
      if(OrderProfit()>=0)
        {
         if(OrderType() == OP_BUY)
           {
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, slip))
               Print("Не удалось закрыть ордера на покупку!");
           }
         else
            if(OrderType() == OP_SELL)
              {
               if(!OrderClose(OrderTicket(), OrderLots(), Ask, slip))
                  Print("Не удалось закрыть ордер на продажу!");
              }
        }
      else
         for(j=0; j<nOrd; j++)
            if(tkt==Ord_ticket[j])
              {
               if(OrderLots()<Ord_lot[j])
                  Ord_lot[j]=OrderLots();
               Ord_lot[j]=NRL(Ord_lot[j]);
               if(OrderType() == OP_BUY)
                 {
                  if(!OrderClose(OrderTicket(), Ord_lot[j], Bid, slip))
                     Print("Не удалось закрыть ордера на покупку!");
                 }
               else
                  if(OrderType() == OP_SELL)
                    {
                     if(!OrderClose(OrderTicket(), Ord_lot[j], Ask, slip))
                        Print("Не удалось закрыть ордер на продажу!");
                    }
               break;
              }
     }
  }

負け注文の部分決済を考慮しながらグリッドオーダーを決済すると、決済が必要な一部のロットを大きい方に丸めた結果、損失が発生します。

問題は、この2つの関数を使って、負け注文を計算する関数というか、決済する注文の一部を書くことができるかということです。

もしそうなら、書くのを手伝ってください

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

 
EVGENII SHELIPOV #:

こんにちは!!!!

もしそうなら、書くのを手伝ってください。

タイミングが悪いんです。

書いてあげるってこと?

 
Andrey Sokolov #:

今はいい時代ではない。

あなたのために書くということですか?

自分を破らないように アレキサンダー

 

初歩的なことで迷っている。

トロールポーズをどのように整理するか - co-directed、なぜか1つのポーズをトロールする、つまり、トロールしない。MT5

for (i=0; i<PositionsTotal(); i++)   
     if (a_position.Select(_Symbol))       
     if (PositionSelect(_Symbol)) if(Symbol()==PositionGetSymbol(i))  
     if (Magic==PositionGetInteger(POSITION_MAGIC))  
   //  magic = myposition.Magic();   
      {
         //  ------------   перевод в бу  BUY   ------------    
         //if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 
         if (a_position.PositionType() == POSITION_TYPE_BUY)
          if (NLb_fun > 0)
            {
                Print(" перевод в безубыток BUY, _SL = ", _SL, " POSITION_PRICE_OPEN: ",
                     NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits),
                     " NLb_fun = ", NormalizeDouble(NLb_fun,_Digits));
               Modify = true;
 if(Modify)
              {
               Print(" серия рыночных позиций BUY назначена к переводу в безубыток, текущией позы POSITION_PRICE_OPEN = ",
               NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits)," тикет = ",PositionGetInteger(POSITION_TICKET));
                
               trade.PositionModify(_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_BID) - 50*_Point,PositionGetDouble(POSITION_TP));
               Print(" Перенос в бу стоп лосса позиции Buy № ",  PositionGetInteger(POSITION_TICKET));
    ...
           } // к if(Modify)
        }    // к if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 

...

私は、HEDGE市場のポジションを持つトロールのためのポジションの列挙として、単純なコードセクションを使用することができます - ありがとうございました。

問題は解決しました。ウラジーミル・カルプトフさん、改めておめでとうございます!!!!

トロールで!

https://www.mql5.com/ru/code/17263

重要なコツは、ループ内のインデックスを見て、それをチケットオプションで修正することです!!!

//--- при таком методе мы будет сюда попадать на каждом тике.
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
           {
            //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 } 
TrailingStop
TrailingStop
  • www.mql5.com
Пример советника с реализацией Trailing Stop.
 

ArrayJから、ArrayIの要素と 同じインデックスと値を持つ要素をすべてぶつける、という簡単な作業です。

int OnInit()
  {
   int CommonArray[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 13, 13};
   int ArrayI[20]=   {0, 0, 0, 0, 0, 0, 0, 8, 9, 10,  0, 12, 13, 13, 13, 13,  0,  0, 13,  0};
   int ArrayJ[];

   for(int j=0; j<ArraySize(ArrayI); j++)
   {
      ArrayResize(ArrayJ,j+1);
      ArrayJ[j]=CommonArray[j];
   }

   ArrayPrint(ArrayI);
   ArrayPrint(ArrayJ);

   for(int i=0; i<ArraySize(ArrayI); i++)
      if(ArrayI[i])
         for(int j=0; j<ArraySize(ArrayJ); j++)
            if(ArrayI[i]==ArrayJ[j])
               ArrayRemove(ArrayJ,j,1);

   ArrayPrint(ArrayJ);
//---
   return(INIT_SUCCEEDED);
  }

キー文字列がハイライト表示されます。結果

2022.02.26 13:56:48.489 test (NZDUSD,H4)         0  0  0  0  0  0  0  8  9 10  0 12 13 13 13 13  0  0 13  0
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7  8  9 10 11 12 13 13 13 13 13 13 13 13
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7 11

期待される。

2022.02.26 13:56:48.489 test (NZDUSD,H4)         0  0  0  0  0  0  0  8  9 10  0 12 13 13 13 13  0  0 13  0
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7  8  9 10 11 12 13 13 13 13 13 13 13 13
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7          11                13 13    13

ArrayJは動的です、何か問題があるようです...。でも、静止画もいらないんです。

心が折れました。どうしたんだ?それとも、昔の歌に相当するのだろうか。

https://www.mql5.com/ru/forum/1111/page3141#comment_27152680

и

https://www.mql5.com/ru/forum/1111/page3142#comment_27371998

は、名前付き定数について?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2022.01.28
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
x572intraday ArrayIの要素と 同じインデックスと値を持つ要素をすべてぶつける、という簡単な作業です。

キー文字列がハイライト表示されます。結果

期待される。

ArrayJは動的です、何か問題があるようです...。でも、静止画もいらないんです。

1.ArrayResizeはループの外に出した方が良い。

ArrayResize(ArrayJ,ArraySize(ArrayI));
for(int j=0; j<ArraySize(ArrayI); j++)
   {
      ArrayJ[j]=CommonArray[j];
   }

2.ArrayRemove は、配列の要素を「空」にするのではなく、後続の要素をその場所に「移動」させるのです。したがって、後続のインデックスの要素のマッチングが崩れる。

 
JRandomTrader #:

1.ArrayResizeはループの外に移動させるべき

2.ArrayRemove は、配列の要素を「空」にするのではなく、後続の要素をその場所に「移動」させる。したがって、後続のインデックスの要素のマッチングが崩れる。

2は間違いないのですが、わかりやすくするために間隔を置いただけです。また、Helpには静的配列について、「この関数が固定サイズの配列に使われた場合、配列のサイズ自体は変更されません:残りの「末尾」が物理的に 開始位置にコピー されます" ヘルプの例では固定サイズの配列も使っていますが、私は動的なものを使っています。

Re 1.実際のタスクでは、ArrayJやArrayIのサイズも、ましてやCommonArrayのサイズも一致しないので、事前にわからないから、ループの外に出すことはできない。

また、上記の例のように、エレメントのシャッフルが途中で中断されない例もありますね。

int OBJTFVArray[]={1, 2, 3, 4, 5, 6, 10, 12, 1520, 30, 16385, 16386, 16387, 16388, 16390, 16392, 16396, 16408, 32769, 49153, 49154, 49155, 49156, 49157, 49158, 49159, 49160};
int PArray[20]={0, 0, 0, 0, 0, 00, 16390, 16392, 163960, 32769, 49153, 49153, 49153, 49153, 0, 0, 49153, 0};
int PArray_[];

int OnInit()
  {
   for(int p_=0; p_<ArraySize(PArray); p_++)
   {
      ArrayResize(PArray_,p_+1);
      PArray_[p_]=OBJTFVArray[p_+8];
   }

   ArrayPrint(PArray);
   ArrayPrint(PArray_);

   for(int p=0; p<ArraySize(PArray); p++)
      if(PArray[p])
         for(int p_=0; p_<ArraySize(PArray_); p_++)
            if(PArray[p]==PArray_[p_])
               ArrayRemove(PArray_,p_,1);

   ArrayPrint(PArray_);

   return(INIT_SUCCEEDED);
  }

結果は上々です。

 0     0     0     0     0     0     0 16390 16392 16396     0 32769 49153 49153 49153 49153     0     0 49153     0
15    20    30 16385 16386 16387 16388 16390 16392 16396 16408 32769 49153 49154 49155 49156 49157 49158 49159 49160
15    20    30 16385 16386 16387 16388                   16408             49154 49155 49156 49157 49158 49159 49160

でも、そのバリアントがないとダメなんです。どうやら、右側の末尾に同じ値(前の記事を参照)を持つ要素がある場合に、ヒッチが起こるようです - これは、私が上で言及した問題と似ています。

 
x572intraday #:

2については質問がないので、わかりやすくするために間隔を置きました。また、Helpには静的配列について、「固定サイズの配列に対してこの関数を使用した場合、配列自体のサイズは変更されません:残りの「末尾」を 開始位置に物理的にコピー します" ヘルプの例では固定サイズの配列も使っていますが、私は動的なものを使っています。

Re 1.実際のタスクでは、ArrayJやArrayIのサイズも、ましてやCommonArrayのサイズも一致しないので、事前にわからないから、ループの外に置くことはできない。

また、上記の例のように、エレメントのシャッフルが途中で中断されない例もありますね。

結果は上々です。

でも、そのバリアントがないとダメなんです。右側の末尾に同じ値を持つ要素がある場合、どうやらヒッチが起こるようです(前回の記事参照)-これは私が上で言及した問題と似ています。

1.私が示した方法で、ループから取り出すことができますし、そうすべきです。ArrayIのサイズがループの中で変化しない限り。

2.すると、こんな感じになります。

int k=0; // объявляем до цикла - чтобы использовать после
for(int i=0; i<ArraySize(ArrayI); i++) // после предыдущего кода (1) размеры ArrayI и ArrayJ равны
  if(ArrayI[i]!=ArrayJ[i])
    {
     ArrayJ[k++]=ArrayI[i];
    }
ArrayResize(ArrayJ,k);