初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1054

 

Igor Makanu:

標準的なCTradeは、すぐに使えるサービスを提供していません。

MT4では、1 行でコード化されている取引事項があります。MT5では百行 でもSBを通して同じことができない。純粋なMQL5では、さらに悪いことになります。それはいいんです。

 

ありがとうございます。良い例ですね。調べてみます。MT4用のスクリプトはこちらです。

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

10分でゼロから書いたんですか?- まあ、それについては、ロジックは単純明快で、取って書けばいい、MT5では今のところ真空中の球形の馬しか議論していないのですが...。取引や注文がある場合、ネッティングやヘッジなどのアカウントの種類を議論するために残っている...。朝までに何か書きましょう。

 
Igor Makanu:

ありがとうございます、良い例です、勉強します、MT4用のスクリプトを作りました-利益をpipsで決定する

このスクリプトをMT5で実行する方法は、言うまでもないでしょう。しかし、このスクリプト自体にはエラーがあります。

まず、歴史を紹介する

と実行結果

Прибыль последнего закрытого ордера -259 пунктов


以下はエラーです。

int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
 
fxsaber:

そして、ここのエラー。

При таком вычислении легко потерять один пункт.

2つの価格から差額を求め、ポイントで割るという方式が一般的のようです。

でも、オーダーリビッドのスキームは古典的なものなので、念のため、最高値のタイムと比較したいのです。私はそれをしなければならない最初の時間ですが、私は考える必要があります - 99.99パーセントの時間は、誰もMT4でHFT TSを取引しようとはしません。

 
Igor Makanu:

2つの価格から差額を求め、ポイントで割るという方式が一般的のようです。

double -> int のキャスト時の損失。

あとは賛成ですが、考える必要がありますね。命令を執行するスキームは古典的ですし、念のため、最高値と時間を比較したい・・・というのが本音です。私はそれをしなければならない最初の時間ですが、私は考える必要があります - 99.99パーセントのケースでは、誰もMT4でHFT TSを取引しようとはしません。

HFTは何の関係もない。CloseAllスクリプトは、1秒以内に2つのポジションをクローズすることが可能です。MT4では比較しなければならないが、MT5では不要である。また、ArraySortで比較する方が簡単でしょう(例えば、ペナントクローズ 位置に素早く変更したい場合など)。

 
fxsaber:

double -> int のキャスト時の損失。

というのはわかるのですが、2つの価格の差を整数値で正しく計算するにはどうしたらいいのでしょうか?

 
Igor Makanu:

これはすべて明確ですが、2つの価格間のpipsの差はどのように計算するのですか?

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

今日閉じた注文の合計pipsを計算するためのヘルプが必要です (Mql5)

fxsaber さん 2017.10.25 01:00

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

int PriceToInteger( const double Price, const double point )
{
  return((int)(Price / point + 0.1));
}

int GetTotalPips( const datetime From = 0 )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      if (OrderCloseTime() < From)
        break;
      else if (OrderType() <= OP_SELL)
      {
        const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
        
        Res += OrderType() ? PriceToInteger(OrderOpenPrice(), point) - PriceToInteger(OrderClosePrice(), point)
                           : PriceToInteger(OrderClosePrice(), point) - PriceToInteger(OrderOpenPrice(), point);
      }
        
  return(Res);
}

void OnStart()
{
  datetime Today = TimeCurrent();
  
  Today -= Today % PeriodSeconds(PERIOD_D1);
  
  Alert(GetTotalPips(Today));
}
 
fxsaber:

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

特に気に入ったのは

const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);

私は通常、すべてをグローバルな可視性で書きますが、あなたの例はより良く読み取れます。


....


これは正しいのか? オーダーループでは、OrderSymbol()が毎回異なるので、SymbolInfoDouble(OrderSymbol(),SYMBOL_POINT); が毎回再計算されるだろうか?

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者の方からの質問 MQL5 MT5 MetaTrader 5

イゴール・マカヌ さん 2019.06.04 18:43

MT4用のスクリプトです。

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

10分でゼロから書く?- まあ、およそそうですが、ロジックは単純明快で、あなたがそれを取って書く、MT5では我々は真空中の球形の馬だけを議論している...。取引や注文がある場合、ネッティングやヘッジなどのアカウントの種類を議論するために残っている...。で、午前中に何か書きます。

また、始値と終値の差の絶対値をとって、ポジションの利益がゼロより小さい場合は、その値にマイナス記号を代入するのはなぜか、お聞きしてもよろしいでしょうか。
 
Alexey Viktorov:
また、始値と終値の差の絶対値をとって、ポジションの利益がゼロより小さい場合は、その値にマイナスを代入するのはなぜか、お聞きしてもよろしいでしょうか。

その場で、好きなように書きました。+100ポイント出力したいとか、-100ポイント出力したいとか、好みの問題です。特に課題はなかったのですが、注文タイプを判断する条件や 値と終値を比較する条件を書くと、行数が多くなりそうだったので......。

ZS: ここはプログラマーのためのフォーラムですよね?- 彼らは一つのコード(特に他人のコード)を10倍最適化し、5行を4行に置き換えることができます )))