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

 
EVGENII SHELIPOV #:

Good day !!!

ドローダウンが一定レベルに達したときにグリッドEAで最小と最大の注文を閉じるためのコードを書くのを手伝ってください。

最大注文と最小注文の利益を計算するために2つの関数を書きました。

これらの注文の金額を計算する関数があります。こちらは問題ないようです。

問題は、この2つの注文だけをクローズする方法ですが、ClosseAll()関数を見つけました。

問題は、すべての注文をクローズするOrderTicket()関数をどのように変更するかということです

グリッドの最小オーダーと最大オーダーのみのチケットを決定する変数 max_ticket と min_ticket をアタッチする。

それとも、この問題に対するあなたの解決策があるのでしょうか?

void ClosseAll()
{
  int slip = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slip)&&OrderClose(min_ticket , OrderLots(), Bid, slip))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}

と修正する。

if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
 
makssub #:

すみません、また書き間違えてしまいました。もう一回やらせてください)

オープンオーダーのグリッドがあります。現在の価格に最も近い注文の開始価格(OrderOpenPrice)を見つける必要があります。グリッドを構築し続けるためですが、私の注文はほとんど無秩序に構築されています。

オーバーシュートの書き方はわかるのですが、それを言葉で正しく表現できないのです(私は犬のように、何でもわかってしまうのです))。

事例やリンク先があれば、ぜひ投稿してください。MQL4

をループで表示します。

if (MathAbs(OrderOpenPrice()-Bid)<previous_value)
   {
   previous_value=MathAbs(OrderOpenPrice()-Bid);
   nearest_order=OrderTicket();
   }

ループ前の初期化 previous_value=DBL_MAX a nearest_order=0

 
PapaYozh #:

ところで、オブジェクトの生成時に暗黙的に呼び出されることを除けば、どのように違うのでしょうか?

で、しかもコンストラクタで呼び出すと、まだメモリが確保されていないので、コンパイルできません。

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a(),a.val(10) {} //
};

が、コンストラクタ本体では、問題ありません。

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a() {a.val=10;}
};



ベースクラスのコンストラクタについて -明示的に呼び出す ことができます。

class A
{
public:
   int               val;
                     A(const int v): val(v) {}
                     A() {}
};
//+------------------------------------------------------------------ +
class B: public A
{
public:
                     B(): A(100) {}
};
 
MakarFX #:

それも直せ。

アドバイザーの冒頭ですでに持っているスレについて

MakarFX#:

と修正する。

MakarFX#:

これを解決する

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
{
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   return (0);
}

決済結果に応じて最大注文のみ決済される


 
Taras Slobodyanik #:

をループに入れる。

ループの前にprevious_value=DBL_MAX、nearest_order=0を初期化 する。

MakarFX#:

と修正します。

MakarFX#:

と修正する。

ログのエラーについて


 
Good afternoon MirachLtd-Realのようなものを聞いたことがある人はいるだろうか。

 
EVGENII SHELIPOV #:

EAの冒頭で既に持っているスリッページについて

このスリッページはまさにこの機能のためにある...だからBUYやSELLを経由する必要がないのだ

//--- global parameters
int max_ticket = 0;
int min_ticket = INT_MAX;
//+----------------------------------------------------------------------------+
void ClosseAll()
{
  int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slipp)&&OrderClose(min_ticket , OrderLots(), Bid, slipp))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}
//+----------------------------------------------------------------------------+
//| Расчет профита максимального ордера в сетке                                |
//+----------------------------------------------------------------------------+
double GetProfitMaxOrder()
{
   double max_ticket_profit = 0 ;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     max_ticket_profit =  OrderProfit();
                     }
                  }
               }
            }
         }
      }
   return( max_ticket_profit);
}
//+----------------------------------------------------------------------------+
//| Расчет профита минимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
double GetProfitMinOrder()
{
   double min_ticket_profit = 0;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     min_ticket_profit = OrderProfit(); 
                     }
                  }
               }
            }
         }
      }
   return(min_ticket_profit);
 
クラスオブジェクトを 作成するには、クラス記述の後か、OnTick()などのローカルな部分で作成するのが良いでしょうか?2つ目の選択肢は、CPUとRAMの負荷が大きく、あまり経済的ではないと思われます。
 
MakarFX #:

このスリッページはこの機能のためだけのものです...だからBUYやSELLを経由する必要はありません

int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;

ここでは、点数を掛ける必要はありません

type conversionによるデータ損失の可能性 NEVALASHKA.mq4 376 13

コンパイル時に警告が出る


 
EVGENII SHELIPOV #:

点で乗算する必要はありません

type conversionによるデータ損失の可能性 NEVALASHKA.mq4 376 13

コンパイル時に警告が出る


MODE_SPREAD - スプレッド(pips)。

を確認することができます。

   Print(MarketInfo(_Symbol,MODE_SPREAD)," / ",MarketInfo(_Symbol,MODE_SPREAD)*Point);

で、このようにします。

int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;