記事"手動取引のサポーターを作成する"についてのディスカッション

 

新しい記事 手動取引のサポーターを作成する はパブリッシュされました:

近年、為替市場の為のトレードロボットの数は、雪だるま式に増えています。これらのトレードロボットの中には、様々な概念や戦略がありますが、負けない人工知能の作成は誰も成し遂げていません。その為、多くのトレーダーは手動取引を支持しています。しかし、このようなスペシャリストの為に、トレードパネルと呼ばれるロボットアシスタントが作成されています。この記事では、トレードパネルの作成例を『ゼロから』ご紹介していきます。

白紙の紙を手に取り、取り入れる必要のある要素を全て配置しつつ、私達の未来のトレードパネルを描いていきましょう。

未 来のトレードパネルのデザインを設計する時には、その実用性について考える必要があります。まず第一に、パネルは十分に情報量が多いもので、かつ読みやす く、余分な要素で負担が過重にならないものであるべきです。私達はこれは、画面上のただの美しい絵ではなく、トレーダーが実際に使用するツールであるとい うことを常に覚えておく必要があります。

これが私の案です。

デザイン

作者: Dmitriy Gizlyk

 

似たようなパネルは以前からこのサイトに掲載されている。標準的なものと比べて使い道はない。

アイデアとしては

1) 逆指値の後ろに逆指値のボタン。

2)ワンボタンのポジション反転 ボタン。

3) ポジショントラールボタン

4) マーチンゲール逆指値ボタン

5) 利食いボタン 3対1またはカスタマイズ可能。

最低標準設定。

 
Ilya Vasenin:

似たようなパネルは以前からこのサイトに掲載されている。標準的なものと比べて使い道はない。

アイデアとしては

1) 逆指値の後ろに逆指値のボタン。

2)ワンボタンのポジション反転 ボタン。

3) ポジショントラールボタン

4) マーチンゲール逆指値ボタン

5) 利食いボタン 3対1またはカスタマイズ可能。

最低基準設定。

そう、マーケットプレイスにはたくさんの取引パネルがある。フリーランスには、取引パネルを作成するためのさまざまな仕事がたくさんあります。あなたも、他の誰でも、この既製のパネルを無料で使うことができる。しかし、これは記事であって、マーケットプレイスの商品ではない。この記事の目的は、既製の製品を提供することではなく、誰もが自分の要求に従って、自分の取引パネルを作成できる方法を紹介し、学びたい人に教えることです。
 
口座の残高と純資産は、ターミナルの「ツール」タブと重複するパネルの下部に表示される。その代わりに、この場所に現在の日の取引回数とその結果を表示し、将来的には、指定した取引回数 またはその日の指定した損失額に達すると、端末の電源が切れるようにすることを提案する。
 
Dmitriy Gizlyk:
この記事の目的は、既製の製品を提供することではなく、誰もが自分の要求に従って、自分自身の取引パネルを作成できる方法を示し、教えることです。

ドミトリー、今日、あなたのチュートリアルに従ってμl 4でパネルを作り始めました。ほとんどすべてうまくいくのですが、パネルやボタンをクリックすると、買いしか開きません。何が原因でしょうか?

//+------------------------------------------------------------------+
//|トレードパネルmq4
//| Copyright 2015, MetaQuotes Software Corp.
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Button.mqh>

//--- 入力
extern double Lot        = 0.1;      // ロット
extern int StopLoss      = 500;      // ムース
extern int TakeProfit    = 500;      // ヤジ
extern int Slip          = 30;       // リクオーツ
extern int Magic         = 0;        // マジク
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
enum label_align
  {
   left=-1,
   right=1,
   center=0
  };
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class CTradePanel : public CAppDialog
  {
private:

   CLabel            Lots_label;                      // ラベル「Lots」を表示する
   CEdit             Lots;                            // 次の注文の数量を表示する
   CButton           SELL,BUY;                        // 売りボタンと買いボタン
   CButton           CloseAll;                        // 閉じるボタン

   //--- ラベルオブジェクトの作成
   bool              CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align);
   //--- ボタンの作成
   bool              CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size);
   //--- 編集オブジェクトの作成
   bool              CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size);

   //--- イベント関数について
   void              LotsEndEdit(void);               // ロットサイズの編集

   //--- 現在の値の変数
   double            cur_lot;                         // 次の注文のロット

   void              BuyClick();                      // 購入ボタンをクリック
   void              SellClick();                     // 販売ボタンをクリック
   void              CloseClick();                    // CLOSEボタンをクリック 

public:
                     CTradePanel(void){};
                    ~CTradePanel(void){};
   virtual bool      Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420);
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   virtual void      Destroy(const int reason);
  };

CTradePanel TradePanel;
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
// トレードパネル作成
   TradePanel.Create(ChartID(),"Panelka",0,20,20,150,200);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   TradePanel.Destroy(reason);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CTradePanel::CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align)
  {
// すべてのオブジェクトは別々の名前でなければならない
   string name=m_name+"Label"+(string)ObjectsTotal(chart,-1,OBJ_LABEL);
//--- Create関数を呼び出す
   if(!object.Create(chart,name,subwindow,x,y,0,0))
     {
      return false;
     }
//--- テキストを調整する
   if(!object.Text(text))
     {
      return false;
     }
//--- テキストをダイアログボックスのグリッドに合わせる
   ObjectSetInteger(chart,object.Name(),OBJPROP_ANCHOR,(align==left ? ANCHOR_LEFT_UPPER :(align==right ? ANCHOR_RIGHT_UPPER : ANCHOR_UPPER)));
//--- コントロールにオブジェクトを追加する
   if(!Add(object))
     {
      return false;
     }
   return true;
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CTradePanel::CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size)
  {
// すべてのオブジェクトは別々の名前でなければならない
   string name=m_name+"Button"+(string)ObjectsTotal(chart,-1,OBJ_BUTTON);
//--- Create関数を呼び出す
   if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size))
     {
      return false;
     }
//--- テキストを調整する
   if(!object.Text(text))
     {
      return false;
     }
//--- ボタンのフラグをロック解除に設定する
   object.Locking(false);
//--- ボタンのフラグを未押しに設定する
   if(!object.Pressed(false))
     {
      return false;
     }
//--- コントロールにオブジェクトを追加する
   if(!Add(object))
     {
      return false;
     }
   return true;
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CTradePanel::CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size)
  {
// すべてのオブジェクトは別々の名前でなければならない
   string name=m_name+"Edit"+(string)ObjectsTotal(chart,-1,OBJ_EDIT);
//--- Create関数を呼び出す
   if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size))
     {
      return false;
     }
//--- テキストを調整する
   if(!object.Text(text))
     {
      return false;
     }
//--- 編集ボックスのテキストを揃える
   if(!object.TextAlign(ALIGN_CENTER))
     {
      return false;
     }
//--- 読み取り専用フラグをfalseに設定する
   if(!object.ReadOnly(false))
     {
      return false;
     }
//--- コントロールにオブジェクトを追加する
   if(!Add(object))
     {
      return false;
     }
   return true;
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CTradePanel::Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420)
  {
// 最初に親クラスのcreate関数を呼び出す
   CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);

// BIDオブジェクトの座標とサイズを計算する

// オブジェクトの作成
   CreateLabel(chart,subwin,Lots_label,"LOT",55,5,0);
   CreateEdit(chart,subwin,Lots,"0.1",33,35,60,20);
   CreateButton(chart,subwin,BUY,"BUY",33,65,60,20);
   CreateButton(chart,subwin,SELL,"SELL",33,95,60,20);
   CreateButton(chart,subwin,CloseAll,"CLOSE",33,125,60,20);

   return(true);
  }
//+------------------------------------------------------------------+
//| イベントハンドリング|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CTradePanel)
ON_EVENT(ON_END_EDIT,Lots,LotsEndEdit)
ON_EVENT(ON_CLICK,BUY,BuyClick)
ON_EVENT(ON_CLICK,SELL,SellClick)
ON_EVENT(ON_CLICK,CloseAll,CloseClick)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| 購入ボタンをクリック|
//+------------------------------------------------------------------+
void CTradePanel::BuyClick(void)
  {
   PutOrder(0,Ask);
  }
//+------------------------------------------------------------------+
//| 購入ボタンをクリック|
//+------------------------------------------------------------------+
void CTradePanel::SellClick(void)
  {
   PutOrder(1,Bid);
  }
//+------------------------------------------------------------------+
//| 購入ボタンをクリック|
//+------------------------------------------------------------------+
void CTradePanel::CloseClick(void)
  {
   CloseAll();
  }
//+------------------------------------------------------------------+
//| 編集後にロット値を読み込む|
//+------------------------------------------------------------------+
void CTradePanel::LotsEndEdit(void)
  {
//--- ロット値を読み取り、正規化する
   cur_lot=NormalizeDouble(StringToDouble(Lots.Text()),2);
  }
//+------------------------------------------------------------------+
//| アプリケーションの初期化関数
//+------------------------------------------------------------------+
void CTradePanel::Destroy(const int reason)
  {
   CAppDialog::Destroy(reason);
   return;
  }
//+------------------------------------------------------------------+
| オーダーの設定|
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| 注文タイプによるポジションのクローズ|
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| エキスパートティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   TradePanel.OnEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
 
Andrew Kornishkin:

ドミトリー、今日、あなたのチュートリアルに従って µl 4 でパネルを作り始めました。ほとんどすべてうまくいくのですが、パネルやボタンをクリックすると、購入したものしか開きません。何が原因でしょうか?

おやすみなさい、アンドリュー。
クラスの説明ではすべて正しく書かれています。唯一の間違いは、取引パネルクラスを作成した 後のOnInit関数で、Run関数で実行を開始していないことです。

int OnInit()
  {
//---
// トレードパネル作成
   TradePanel.Create(ChartID(),"Panelka",0,20,20,150,200);
   TradePanel.Run();
//---
   return(INIT_SUCCEEDED);
  }

よろしく、

ドミトリー。

 
Dmitriy Gizlyk:

おやすみなさい、Andrey。
クラスの説明はすべて正しく行われています。唯一の間違いは、トレードパネルクラスを作成した 後のOnInit関数において、Run関数で実行を開始していないことです。

それでは、

ドミトリー。

ありがとう、ドミトリー!
うまくいきました!
 
あなたの取引パネルをメタトレーダーにダウンロードしたのですが、動きません。残念です。
 
19681:
あなたの取引パネルをメタトレーダーにダウンロードしたのですが、動きません。残念です。

パネルを機能させるには、他の取引プログラムと同様に、ターミナルで自動取引を有効にする必要があります。
 
Dmitriy Gizlyk:

パネルが機能するためには、他の取引プログラムと同様に、ターミナルで自動取引を有効にする必要があります。
自動取引はもちろん有効です。そして、それはボタンが機能しないという事実として現れます(売りまたは買いをクリックすると、"error of open BUY ORDER "と表示されます)。
 
19681:
自動売買はもちろん有効です。そして、それはボタンが機能しないという事実として現れます(売りまたは買いをクリックすると、"error of open BUY ORDER "と表示されます)。
そのシンボルでの取引が許可されているかどうかを確認してください。最近の出来事(Brexit)のため、一部のブローカーは一時的に取引業務を 制限しています。