記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第22部): 取引クラス - 基本取引クラス、制限の検証"についてのディスカッション - ページ 2

 
Artyom Trishkin:

イベント処理の 後、イベント・タイプ・チェック・モジュールの最後で、last_event 変数に何が入っていますか?それをEAでリセットする必要がある。そして、ライブラリの最後のイベントをリセットするメソッドを強制的に呼び出すのではなく、イベントをチャートに送信し、イベントのリストに書き込んだ直後に、ライブラリ自身がそれを呼び出します。

そうです。私が見落として、最後に1行も書いていなかっただけです。

last_event = engine.LastTradeEvent();
 
Alexey Viktorov:

ええ、ただ最後の一行を見逃していました。

TRADE_EVENT_NO_EVENTと同じにすればいい。
 
Artyom Trishkin:
TRADE_EVENT_NO_EVENTと同じにすればいい。

これは機能しない。ティック ごとに表示されます。注文は5ティック目に有効化され、ログに "1 "と4回表示され、その後すべてのティックに "20 "と表示されます。

//--- 最後の取引イベントが変更された場合
 if(engine.LastTradeEvent() != last_event)
  {
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
//---
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
Alexey Viktorov:

うまくいかない。ティック ごとに表示されます。注文は5ティック目に有効化され、ログに "1 "と4回表示され、その後各ティックに "20 "と表示されます。

何を作成したのか確認する必要があります。Expert Advisorのテストでは動作します。
私は携帯電話からです。あと5時間くらいで行きます。
 
Artyom Trishkin:
あなたが何をしたのか見る必要がある。テストアドバイザーではうまくいっています。
今、携帯からです。あと5時間はそこにいない。

まだ何も書いていない。前の記事のコードの上はこれだけです。

//--- 最後の取引イベントの初期化
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- テスターで作業する場合
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
OP_SELLLIMITとOP_SELLSTOPの2つの注文を出す。
 
Alexey Viktorov:

まだ何も作っていない。前のメッセージのコードの上はこれだけです。

そしてコードの下には、OP_SELLLIMITとOP_SELLSTOPの2つの注文があります。
コード全体を見る必要があります。プライベート・メッセージに書くか、7つのシールに隠された秘密でなければここに書いてください。
 
Artyom Trishkin:
コード全体を見たいんだ。プライベート・メッセージに書くか、7つの封印に隠された秘密でなければここに書いてくれ。

そこにはまだ何もない。

/********************************************************************\
|Only_BUY_or_only_SELL.mq4 |
|© 2019, Alexey Viktorov |
|https:mql5.com/ru/users/aleey Viktorov | https: //www.mql5.com/ru/users/alexeyvik/news|
\********************************************************************/
#property copyright "© 2019, Alexey Viktorov"
#property link      "https://www.mql5.com/ja/users/alexeyvik/news"
#property version   "1.00"
#property strict
#define  ndd(A) NormalizeDouble(A, _Digits)
//---
#include <DoEasy\Engine.mqh>
CEngine        engine;
//---
enum MY_ORDER_TYPE
{
 BUY   = OP_BUY,
 SELL  = OP_SELL,
};

struct POZ
{
 double profit;
 ulong  ticket;
 double priceGrid;
 double price;
}poz[];

sinput  MY_ORDER_TYPE   ordType         = SELL;   // 貿易の方向性
sinput  double          lot             = 0.01;   // 敷地面積
 input  int             StepGrid        = 50;     // グリッド間隔
 input  double          desiredProfit   = 10;     // 望ましい利益
sinput  bool            Should_I_open   = false;  // 新しいポジションシリーズを開設すべきでしょうか?
sinput  int             magick          = 1;      // マジックナンバー
//---
int slip = 100;
double contract, stepGrid, priceGrid;
int totalPositions, levelNumb;//, levelBUY, levelSELL;

/*******************Expert initialization function*******************/
int OnInit()
{
 stepGrid = StepGrid*_Point;
 return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//--- 最後の取引イベントの初期化
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- テスターで作業する場合
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- 最後の取引イベントが変更された場合
 if(engine.LastTradeEvent() != last_event)
  {
 //Print(__FUNCTION__, "***", last_event);
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
 if(Should_I_open && OrdersTotal() == 0)
  {
   priceGrid = ndd(ordType == SELL ? Bid+stepGrid/2 : Bid-stepGrid/2);
   ENUM_ORDER_TYPE type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLLIMIT : OP_BUYSTOP);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
   priceGrid = ndd(ordType == SELL ? Bid-stepGrid/2 : Bid+stepGrid/2);
   type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLSTOP : OP_BUYLIMIT);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
  }
  return;
}/*******************************************************************/

void OrderActivated()
{
 Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
 
}/*******************************************************************/

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//--- 最後の取引イベントの初期化
 static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- テスターで作業する場合
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- 最後の取引イベントが変更された場合
 if(engine.LastTradeEvent()!=last_event)
  {
   last_event=engine.LastTradeEvent();
  }
}/*******************************************************************/

/***************************Timer function***************************/
void OnTimer()
{
 if(!MQLInfoInteger(MQL_TESTER))
  engine.OnTimer();
}/*******************************************************************/

void OnDeinit(const int reason)
{
 Comment("");
}/*******************************************************************/
 
Alexey Viktorov:

まだ何もない

答えを得るためには、あなたのコードを実行しなければならない。そうしたらまた連絡するよ。
 
Artyom Trishkin:
答えを得るためには、あなたのコードを実行しなければならない。すぐに行く。

あなたが家にいないことは知っているし、急かすつもりもない。

 
Alexey Viktorov:

あなたが家にいないことは知っているし、急かしているわけでもない。

いや、それどころか、仕事中じゃなくて家にいるんだ。)