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

 
Taras Slobodyanik #:

それでも新しいティックごとに条件を確認する必要があり、前のティックでうまくいかなかった場合は、新しいティックで変更することになります。

そして、エラー処理も行わなければならない。

配列でやるなら、そこに書き込まれた変更された注文のティックだけを他の全ての注文と照合してください。

MakarFX#:
だいたいで結構です、はい、ありがとうございます。その場合、オブジェクトに保存する場合は、チケットではなく、ユニークなマジックを用意しないと、同じ名前のオブジェクトが何十個もできてしまいます。

StringToInteger(ObjectName(0,i,0)
タイプミス?どちらの関数もパラメータは1つしかとれないと思います。
 
Документация по MQL5: Графические объекты / ObjectName
Документация по MQL5: Графические объекты / ObjectName
  • www.mql5.com
ObjectName - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nerd Trader #:
配列を通して行うのであれば、そこに書き込まれた修正注文のティックのみを他の全てのものと照合します。 だいたい合ってますね、はい、ありがとうございます。その場合、オブジェクトに保存するのであれば、チケットではなくユニークなマジックを用意しないと、

同じ名前のオブジェクトが何十 個とできてしまう。

タイプミス? どちらの関数もパラメータは1つしかとれないと思います。

それはないでしょう。

if(ObjectName(i)!=OrderTicket()) ObjectDelete(0,ObjectName(i));

申し訳ありません

StringToInteger(ObjectName( i));
 

MT5用です。

で、これはMT4用 です。

 
MakarFX #:

それはないでしょう。

申し訳ありません

ところで、以下のようなエラーが定期的に発生するのはなぜか、ご存じでしょうか?正常に開いた注文100件に対して、10件ほどあります。

2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: 4051 | order.sl_price: 2.813499706815862e-262
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: OrderSend error 4051
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: unknown trade cmd 406958564 for OrderSend function

order.sl_price: 2.813499706815862e-262 - ストップループ価格、明らかにこの数値はあってはならないものです。
4051 - "Invalid value of function parameter"
- これは注文の種類ですか?それも問題ないはずです。

class Order{
  public:
    double open_price;
    double sl_price;
    double tp_price;
    color  arrow_color;
    string error_text;
    int cmd;

    Order(){};

    void InitForSell(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.hight + (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrRed;

      if(type == "sellstop"){
        open_price = NormalizeDouble(db_last.low - (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.low - (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELLSTOP;
        error_text = "Ошибка открытия селстопа ";
      }

      if(type == "sell"){
        open_price = Bid;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid - tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELL;
        error_text = "Ошибка открытия села ";
      }
    };

    void InitForBuy(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.low - (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrGreen;

      if(type == "buystop"){
        open_price = NormalizeDouble(db_last.hight + (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.hight + (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUYSTOP;
        error_text = "Ошибка открытия байстопа ";
      }

      if(type == "buy"){
        open_price = Ask;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid + tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUY;
        error_text = "Ошибка открытия бая ";
      }
    };

    ~Order(){};
};

//-------------------------------------------

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 1, 
    order.sl_price, order.tp_price, "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }
 
MakarFX #:
チケットや価格で「最小と最大」を意味するのでしょうか?

チケットで

 
Nerd Trader #:

ところで、以下のようなエラーが定期的に発生するのはなぜか、ご存じでしょうか?正常に開いた注文100件に対して、10件ほどあります。

order.sl_price: 2.813499706815862e-262 - ストッププライス、明らかにこの数値はあってはならないものです。
4051 - "Invalid value of function parameter"
- これは注文の種類ですか?こちらも特に問題はないはずです。

"NormalizeDouble " を動かしてみる。

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, NormalizeDouble(order.open_price, Digits), 1, 
    NormalizeDouble(order.sl_price, Digits), NormalizeDouble(order.tp_price, Digits), "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }

 
EVGENII SHELIPOV #:

チケットで

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderTicket()== GetTicketMaxMinOrder(0) || OrderTicket()== GetTicketMaxMinOrder(1) ) {
             p=MarketInfo(OrderSymbol(), MODE_POINT);
             if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
             if (OrderType()==OP_BUY) {
               pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
             }
             if (OrderType()==OP_SELL) {
               pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
            }
          }
        }
      }
    }
  }
  return(pr);
}
 
MakarFX #:

"NormalizeDouble " を移動してみる

を変更しました。

 
MakarFX #:

MakarはこれまでEAに通貨単位の利益とpips単位の利益を比較するコードを挿入してきましたが、私が理解する限り、これらの関数がゼロ値のときに理解することができます。