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

 
PolarSeaman:

この特定のポジションの履歴の中で、一部が閉じていることをどうやって知ることができるのでしょうか?

1.0ロットで建てたポジションを 0.5で決済して10$の損失。 その後、さらに0.25で決済して5$の利益。 50$の利益で全て決済する予定です。実際、今は50ドルの利益が出ています。

現在の利益の計算で、-$10と+$5を閉じるにはどうしたらいいですか?55ドルの利益で終了すること

ポジションのコメントをご覧ください(mql4内) - 閉じた部分には残りの部分のチケットがあり(to#1234556789)、残りの部分には閉じた部分のチケットがあります(from#123456788) - どこでギャップがあるか覚えていません - あなた自身のために表示されます。

 
Artyom Trishkin:

ポジションのコメントを見てください(mql4内) - 閉じた部分には残りのチケット(to#1234556789)があり、残りの部分には閉じたチケット(from#123456788)があります - スペースがどこにあるかは覚えていません - 自分で見てください

クローズしたポジションの コメントとオープンしたポジションのチケットを比較すると、"0.0 "が返ってきます。

double prof_cl_pos(string sy="0", int op=-1, int mn=-1) {
  datetime ta;
  int      i, k=OrdersHistoryTotal();
  double profit_=0;
  string comment="";

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
             // comment=OrderComment();
              if (ticket_op_pos(Symbol(), -1,mn)==OrderComment())
              profit_=OrderProfit();
            }
          }
        }
      }
    }
  }
  return(profit_);
}
  int ticket_op_pos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  string comment="";
  int     ticket, i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
                ticket=OrderTicket();
              }
            }
          }
        }
      }
    }

  return(ticket);
}
 
PolarSeaman:

クローズドポジションの コメントとオープンポジションの チケットを比較すると、"0.0 "が返されます。

コメントから、チケットはハイライトされるべきです。つまり、"from #" や "to #" のような余分な文字は削除されるべきです。ここではやっていない。

 
Ihor Herasko:

コメントから、チケットをハイライトする必要があります。つまり、"from #" や "to #" のような余分な文字を削除する必要があります。これは、ここでは行われません。

その通り!「to #」をどう切り取るか?
 
PolarSeaman:
その通り!「#に」をどう切るか?
文字/部分文字列 # の出現箇所を探し、(オプションで)その前に "from" または "to" があることを確認する。

余った部分をロングに変換する

in-5eでは、初歩的な正規表現があり、より簡単になります。

 
Maxim Kuznetsov:
文字/部分文字列の出現箇所を検索する #。
何をもって探すのか?
 
PolarSeaman:
どうやって探すの?

サイト内検索がうまくいかない?ページの一番上にドキュメントがないのですか?

Документация по MQL5: Строковые функции / StringSubstr
Документация по MQL5: Строковые функции / StringSubstr
  • www.mql5.com
[in]  Длина извлекаемой подстроки. Если значение параметра равно -1 либо параметр не задан, то будет извлекаться подстрока, начиная с указанной позиции и до конца строки.
 
Artyom Trishkin:

サイト内検索がうまくいかない?ページの一番上にドキュメントがないのですか?

ありがとうございます、こうしてみました。

              comment=OrderComment();
               substr = StringSubstr(comment, 4, 9);//пропускаю "to #" беру цифры
              if (ticket_op_pos(Symbol(), -1,mn)==substr)

が、検索履歴機能で未決済 ポジションの現在の利益を返すようになりました。

double prof_cl_pos(string sy="0", int op=-1, int mn=-1) {
  datetime ta;
  int      i, k=OrdersHistoryTotal();
  double profit_=0;
  string comment="";
  string substr="";

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              comment=OrderComment();
               substr = StringSubstr(comment, 4, 9);
              if (ticket_op_pos(Symbol(), -1,mn)==substr)
              profit_=OrderProfit();
            }
          }
        }
      }
    }
  }
  return(profit_);
}
 

> ありがとうございます、そのようにしました。

未定義の文字列を扱う場合、フラグメントの長さや開始位置に依存することはできません。

StringFind()関数は、"#"または "from #"を検索することができます。

ps/ も、大文字か小文字のどちらか一方を使うべきです。残念ながらコメントにタグを付けるプロトコルはないので、サーバーによっては「FROM #」と(大文字で)書かれている可能性があります。
特に、ストップロス時のコメントの最後に、あるものは[sl]を、あるものは(sl)を入れています。ちなみにコメントの大きさも制限されています。などなど。
 

そのような作りの弊害は何でしょうか。

datetime tm1 = D'09.04.2018';
long     tm2 = TimeCurrent();

 if(tm1 > tm2) Print("Работает");

それとも、datetime をlong型にした方が良いのでしょうか?