エラー、バグ、質問 - ページ 1863

 
fxsaber:

テスターのACCOUNT_PROFITは無意味なことを表示しています。


付け加えます。

1. 交換用機器について

Как следствие, неправильно оцениваются эквити, просадка и т.д.

2.また、ポジションの合計損益に着目した場合、Expert Advisorのロジックが正しく動作しない。

決算時には、ACCOUNT_PROFITの値を重視します。

2017.04.20 11:30:26.318 Core 1  2017.04.17 18:02:46   Профит = 333.01

決算時に、端末が利益を再計算するので、最終的に

損切り

2017.04.20 11:30:26.318 Core 1  2017.04.17 22:02:08   Профит = -338.66

ということになります。

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
//--- global variable
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
input     string symb="GOLD-6.17";
input     string symb1="GOLD-9.17";
input     double  ТП  =333;
datetime date1;
double i1,ask1,ask2,bid1,bid2,last1,last2,profit;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  double price1=SymbolInfoDouble(symb,SYMBOL_BID);
  double price2=SymbolInfoDouble(symb1,SYMBOL_BID);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
Comment("");
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {
//---
      profit=AccountInfoDouble(ACCOUNT_PROFIT);
      Comment("ПРофит = ",profit);
     if(PositionsTotal()==0 )
     {
      m_trade.Buy(1.00,symb);
      m_trade.Buy(1.00,symb1);    
     }

   if( MathAbs(profit)>=ТП )
     {
      Print("Профит = ",profit);
     CloseAll();
     }

  }  
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         m_trade.PositionClose(m_position.Ticket());
  }
//+------------------------------------------------------------------+

 
kaus_bonus:

追加します。

SDでは...
 
Slawa:
どうやら私はHFTについて何か理解していないようです。私の知る限り、「超高速」トレードをする場合、過去のトレードは気にしない。

HFTは、ただ多くの取引を行うだけのTSの例を挙げた。

一部のスキャルパーを長期にわたって実行することができます。トレード数が多い(数万件)ことが大きなポイントです。そうすると、現在の履歴を扱う実装のデメリットが見えてきます。


現状は以下の通りです。案件が多い場合は、履歴を使用しない。

 
fxsaber:
SDでは...


というのはすごいですね。

十分な結果を得るためには、LAST priceの使用を削除する必要があります。

 

ポジションのオープン価格からストップロスやテイクプロフィットのレベルまでのポイントの最小の刻み目を 見つけるのを助けてください。SymbolInfoInteger(下記コード参照)を使ってみたのですが、この計算では0が返ってきます。どなたか、正しい計算方法を教えてください。

void OnStart()
  {
   long stopLevel;
   if(SymbolInfoInteger("EURUSD",SYMBOL_TRADE_STOPS_LEVEL,stopLevel))
      Print("stopLevel = ",stopLevel);
  }
 
Maxim Khrolenko:

ポジションのオープン価格からストップロスやテイクプロフィットのレベルまでのポイントの最小の刻み目を 見つけるのを助けてください。SymbolInfoInteger(下記コード参照)を使ってみたのですが、この計算では0が返ってきます。どなたか、正しい計算方法を教えてください。


0 - 制限なし。しかし、SYMBOL_SESSION_PRICE_LIMIT_MINとSYMBOL_SESSION_PRICE_LIMIT_MAXも存在する。
 
fxsaber:

0 - 制限はありません。しかし、SYMBOL_SESSION_PRICE_LIMIT_MINとSYMBOL_SESSION_PRICE_LIMIT_MAXも存在する。
うーん、その場合、SYMBOL_TRADE_STOPS_LEVELがどうにかして別の働きをしてくれればいいんですけどね。0が無制限であれば、理論的には、.PositionOpen(...)をサーバに送信する際に、建値から 1ポイント(5桁)のところにストップを設定できますが、TRADE_RETCODE_INVALID_STOPSエラーは100%ポップアップされます。今のところガチガチです。
 
Maxim Khrolenko:
うーん、その場合、SYMBOL_TRADE_STOPS_LEVELがどうにかして別の働きをしてくれればいいんですけどね。0 が無制限であれば、理論的には、.PositionOpen(...) をサーバに送信するときに、建値から 1 pip (5 digits) のところにストップを置くことができますが、ここでは TRADE_RETCODE_INVALID_STOPS エラーが 100% ポップアップ表示されるでしょう。今のところガチガチです。

これはどうでしょう?

 if(stoplevel==0) stoplevel=SymbolInfoInteger(symb,SYMBOL_SPREAD);
 
テスターにまた何か起こった - 1586年再生用Expert Advisor
#include <MT4Orders.mqh>

// Metaquotes-Demo, RTS-6.17, 2017.04.07 - 2017.04.08, на основе реальных тиков, начальный баланс 100000
void OnTick()
{  
  static int Type = OP_BUY;

  MqlTick Tick;    
  
  if (OrderSelect(0, SELECT_BY_POS) && (OrderType() <= OP_SELL))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);    
  else if ((OrdersTotal() == 0) && SymbolInfoTick(_Symbol, Tick) && (Tick.bid != 0) && (Tick.ask != 0))
  {
    OrderSend(_Symbol, Type + OP_BUYLIMIT, 1, (Type == OP_BUY) ? Tick.ask : Tick.bid, 0, 0, 0);
    
    Type = OP_SELL - Type;
  }    
}

ティックごとに、現在の価格で指値をするか(すぐに実行する)、ポジションを閉じるか。つまり、ポジションがたくさんあるはずなのです。しかし、リミッターの実行が停止しているため、このようなことはありません。以下は、そのログの最後です。

2017.04.20 12:47:41.885 2017.04.07 10:00:00   sell limit 1.00 RTS-6.17 at 114060 (114060 / 114180 / 113770)
2017.04.20 12:47:41.885 2017.04.07 23:44:59   order canceled due end of test [#140  sell limit 1.00 RTS-6.17 at 114060]
2017.04.20 12:47:41.885 final balance 91195.12 RUR
2017.04.20 12:47:41.885 RTS-6.17,M1: 327182 ticks, 788 bars generated. Test passed in 0:00:00.218.

SellLimitがBidに設定されたが、実行されなかった。

1585年当時は何もかもがOKだった。

 
fxsaber:
テスターにまた何かされた-1586。

そして、私が間違っていることは理解していますが、それでも、ビルドのリリースに対する何か間違ったアプローチをしているような印象を受けるのです。以前は、ビルドのリリース後にこれほど多くのバグレポートが出ることはありませんでした。