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

 
Karlson:
サーバーが違えば、500ppも違う。
サーバーが違うことと、何か関係があるのでしょうか?これは同一人物による2つのテストです。テスターで指定した通貨ペアのみ異なる
 
ilunga:
サーバーが違うことと、何か関係があるのでしょうか?これは同一人物による2つのテストです。テスターで指定した通貨ペアのみ異なる
ターミナル/テスターを更新すれば、多分すべてがうまくいくでしょう。私は687ビルドを持っていますが、すべてがうまくいきます。
 
fyords:

デモのMKサーバーはすべて正しいです。

では、注文を出すときの括弧内の数値は何なのか、なぜ一方では (1.29565 / 1.29654) で、他方では (1.29443 / 1.29479 / 1.29443) なのか、ご説明ください。

(あなたの検査結果のことです。

fyords:
ターミナル/テスターを更新すれば、多分全てがうまくいくでしょう。私は687ビルドを持っていますが、全てがうまくいきます。

EAをチャンピオンシップに送信する際、まったく同じエラーが表示されます(自動テスト)。


さらに言えば1回だけ表示される("your "以外の通貨ペアで最初に注文しようとしたとき)。

 
ilunga:
サーバーが違うことと、何か関係があるのでしょうか?これは同一人物による2つのテストです。テスターで指定した通貨ペアのみ異なります。

テスターに関する記事をご覧ください。

他の通貨ペアでテストする場合、価格は同じである必要はありません。

 
Rosh:

テスターに関する記事をご覧ください。

他の通貨ペアでテストした場合、価格が一致する必要はありません。

そこで、さらにいくつかのテストを行った。本当に「現在の価格」の問題。

コード

#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>

CSymbolInfo       m_sym;
CTrade            m_trade;

double bar_info[2];
bool a;

int OnInit()
{
   SymbolSelect("EURUSD", true);
   SymbolSelect("GBPUSD", true);
   m_sym.Name("EURUSD");
   a = false;
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   m_sym.Refresh();
   m_sym.RefreshRates();
   CopyHigh("EURUSD", PERIOD_D1, 0, 2, bar_info);
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
   Print("Цена открытия:" + DoubleToString(bar_info[1] + 5000*_Point));
   BUY_pending("EURUSD");
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
}

uint BUY_pending(string symbol)
{
   CopyHigh(symbol, PERIOD_D1, 0, 2, bar_info);
   // готовим запрос
   MqlTradeRequest request = {0};
   ZeroMemory(request);
   request.action = TRADE_ACTION_PENDING;
   request.magic  = 0;
   request.symbol = symbol;
   request.volume = 1;
   request.price  = m_sym.Ask() + 1;
   request.sl     = 0;
   request.tp     = 0;
   request.deviation = 10;
   request.type   = ORDER_TYPE_BUY_STOP; 
   request.type_filling = ORDER_FILLING_FOK;
   MqlTradeResult result;
   OrderSend(request,result);
   Print(IntegerToString(result.retcode));
   return (result.retcode);
}

ちなみに、私はAskシンボル価格プラス1(大きなマージン)でオープンしています。同時に現在のAskとBidを印刷する前と後。


結果(GBPUSDでテストした場合)。

GR      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
LH      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000
QL      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Цена открытия:1.34220000
GD      0       Trade   11:49:40        2012.01.02 09:00:00   buy stop 1.00 EURUSD at 2.29241 (1.29709 / 1.29722)
IG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   10009
CP      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
HG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000

注文の前後で価格1.29241が表示されます。一方、括弧内(注文時)は1.29722です。どのように?それとも、私が現在の価格を間違って取得しているのでしょうか?


そして第二に、もし価格にエラーがあったのなら、なぜエラー10016(ストップ高)になるのでしょうか?

 
ilunga:

しかし、カットシーンではまだエラーが発生しています。

正直なところ、エラー10016が 停止していない場合にどうなるのか、よくわかりません。

何をどのようにやっているのかわからない、問題は本当にSLにあるのだろう。

私のバージョンは問題なく動作しています。呼び出しは、しかし、チェックに悩まされないように、初期化ブロックに投げた(それを設定する前に順序の存在は、チェックする価値があるだろうが)。

bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,2,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[1] + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
//Preparation of request
TradeRequest.type_filling = ORDER_FILLING_FOK;
TradeRequest.action       = TRADE_ACTION_PENDING;
TradeRequest.type         = ORDER_TYPE_BUY_STOP; 
TradeRequest.deviation    = 10;
TradeRequest.symbol = symbol;
TradeRequest.magic  = magic;
TradeRequest.volume = volume;
TradeRequest.price  = price;
TradeRequest.sl     = sl;
TradeRequest.tp     = tp;
//Checking
Result = OrderCheck(TradeRequest,CheckResult);
  if((!Result)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
ファイル:
 
Interesting:

そこで何をやっているのかわからないが、問題は本当にSLにあるのだろう。

私のバージョンは問題なく動作しています。この呼び出しは本当に初期化ブロックに転送され、チェックに煩わされないようにするためです(設定前のオーダーの有無はチェックする価値があるでしょうが)。

ちょっとしたお願いです。OrderSendの前にシンボルの現在の 価格を出力するように、コードを修正することはできますか?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
ilunga:
ちょっとしたお願いです。OrderSendの前に、Openする商品の現在の 価格を出力するようにコードを微調整することは可能ですか?

この方法で試してみてください。

   MqlTradeResult result;
   if(!OrderSend(request,result))
     {
      PrintFormat("retcode=%d price=%G  Ask=%G  Bid=%G Comment=%s",
                  result.retcode,result.price,result.ask,result.bid,result.comment);
      //---
      PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
                  EnumToString(request.type),symbol,request.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
                  SymbolInfoDouble(symbol,SYMBOL_BID));
      Print("------------");
     }
 
ilunga:
小さな要望です。OrderSendの前に、そのツールに現在の価格を 出力するようにコードを修正することはできますか?

プライススプリッツァー?その必要はないと思います。チェックの成功/失敗のメッセージと注文の設定を追加すればいいのです。

原理的には自分でできることであり、難しいことではないはずです(アイデア次第)。

ロッシュ

この方法で試してみてください。

デバッグにはかなり有効だが、実用的なコードでは不要になる(少なくとも、少しいびつな解決策になる)

また、注文はOrderCheckの後にした方が、エラー時にOrderSendに移行することがないため良い。

追記

付け加えると、この例からすると、bar_infoは 問題なく関数内に配置することができます。

 
Interesting:

プライススプリッツァー?その必要はないと思います。チェックの成功/失敗のメッセージと注文の設定を追加すればいいのです。

原理的には自分でできる、難しくないはず(発想的に)。

デバッグには十分かもしれませんが、プロダクションコードでは余計なお世話でしょう(少なくとも、ちょっと曲がった解決方法です)。

また、注文はOrderCheckの後にした方が、エラー時にOrderSendに辿り着けないので良いと思います。

追記

付け加えると、この例からすると、bar_info は関数内に置いても問題ないでしょう。

面白いですね。この例では、GBPのBUYSTOPを削除し、EURUSDのみを残しています。

リクエストのフィールドを埋めた後、保留中の注文の 価格を出力しています。

1) バリアントがある - 保留注文がIniteに置かれる

2012.01.01 00:00:00 価格 = 1.30487000

2) initをコメントアウトし、OnTickに移動しました。最初のティックにのみトリガーする条件をつけました。

2012.01.02 09:00:00 価格 = 1.29720000


P.S. 私の(そしてあなたの)コードでは bar_info[1] は現在のバーの最大値であると正しく理解していますか?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5