MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 500

 
Konstantin Seredkin:

私は例を挙げただけで、このボタンに載せると良いアルゴリズムは他にもたくさんあります。スプレッドが広がり、ボタンが押され、携帯電話にテキストメッセージが来て、ロボットが停止しているとか、4台のロボットが口座で取引している、5台目は口座のマージンをコントロールしている、マージンが設定値まで下がると、自動取引を切り、私が来て、何が、どこでドローダウンしているのかを見るまで全てのロボットが吸い込まれるのです。しかし、チャートからロボットを削除することは、ウサギに対する大砲である...ボタンは、決められたアルゴリズムによってすべてのロボットを殺すことができる複雑な解決策である。

mql5の解決策をどこかで見たことがあるのですが、見当たりません。

それが、抜本的な解決策だと言っているのです。正しい解決策は、Expert Advisorのコードを変更し、特定の状況下で、取引アクションとそれに関連するすべてのものを実行しないようにすることです。例えば、スプレッドコントロールは初歩的なものです。

void OnTick()
{
    double fPoint = Point();
    if (fPoint <= 0.0)
      return;

    int nSpread = int(MathRound((Ask - Bid) / fPoint));
    if (nSpread > 50)
      return;

   ... Действия советника при нормальном спреде
}
 

さて、オートトレードボタンは、Ctrl+Eをエミュレートすることで押下/解除が可能です。しかし、先ほども言ったように、これはWinAPIによるものです。

#include <WinUser32.mqh>

#define  VK_CONTROL 0x11 
#define  KEY_CODE   'E'


void PressOrReleaseAutotrade()
{
   keybd_event(VK_CONTROL, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 2, 0);
   keybd_event(VK_CONTROL, 0, 2, 0);   
}
 
Ihor Herasko:

さて、オートトレードボタンは、Ctrl+Eをエミュレートすることで押下/解除が可能です。でも、これってやっぱり、すでにWinAPIを使っているんですよね。

ありがとうございます!あと、スマイリーフェイスを悲しませるなんて......(笑)。

 
Ihor Herasko:

さて、Ctrl+Eをエミュレートすることで、AutoTradeボタンを押したり外したりすることができます。しかし、やはりこれはWinAPIでの話です。

そのとおりで、痛快なほどシンプルな方法だと思い、このライブラリの存在をすっかり忘れていました。ありがとう、これで好きなことができるようになった

 

長方形を描く MQL4スクリプト(下記コード)を作ったのですが(下記写真)、ここで問題が発生しました。破線 STYLE_DOT は幅 1 のみ動作し、2 以上で実線が描画されます。私の間違いがどこにあるのか、それとも何か隠されているのか、教えていただけませんか?

#property strict
void OnStart()
  {
//---
   RectCreate("rect1",Time[1],Low[1],Time[10],High[10],clrYellow,STYLE_DOT,  1,  false);
   RectCreate("rect2",Time[11],Low[11],Time[20],High[20],clrRed, STYLE_DOT,  2,  false);
//---
   Sleep(20*1000);
   ObjectsDeleteAll(0);
  }
//--- Function creates rectangle
void RectCreate(const string           f_name,     // rectangle name
                datetime               f_time1,    // first point time
                double                 f_price1,   // first point price
                datetime               f_time2,    // second point time
                double                 f_price2,   // second point price
                const color            f_color,    // rectangle color
                const ENUM_LINE_STYLE  f_style,    // style of rectangle lines
                const int              f_width,    // width of rectangle lines
                const bool             f_fill)     // filling rectangle with color

  {
   if(ObjectCreate(0,f_name,OBJ_RECTANGLE,0,f_time1,f_price1,f_time2,f_price2))
     {
      ObjectSetInteger(0,f_name,OBJPROP_COLOR,f_color);
      ObjectSetInteger(0,f_name,OBJPROP_STYLE,f_style);
      ObjectSetInteger(0,f_name,OBJPROP_WIDTH,f_width);
      ObjectSetInteger(0,f_name,OBJPROP_FILL,f_fill);
      ObjectSetInteger(0,f_name,OBJPROP_BACK,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTED,false);
     }
  }

 
Maxim Khrolenko:

長方形を描く MQL4スクリプト(下記コード)を作ったのですが(下記写真)、ここで問題が発生しました。破線 STYLE_DOT は幅 1 のみ動作し、2 以上で実線が描画されます。私の間違いがどこにあるのか、それとも何か隠されているのか、教えていただけませんか?

そして手動で描画し、スタイルと厚みを変更しようとした?そして、これらの実験からどのような結論が導き出されるのでしょうか。
 
Artyom Trishkin:
手動で描画してスタイルや太さを変えてみましたか?そして、これらの実験からどのような結論が導き出されるのでしょうか。

答えが見つかったような気がします。ここには「行書体」と書かれています。線の太さが0または1インチのときのみ使用されます。幅2以上の線が実線以外ではうまくいかないのは、このためでしょう。

 
Maxim Khrolenko:

答えが見つかったような気がします。ここには「行書体」と書かれています。線の太さが0または1 "の時のみ使用します。実線以外の線が2以上の太さで効かないのは、このためでしょう。

まさにその通りです。私も経験あります。

 

皆さん、アドバイスをお願いします。私は、最後に開いたポジションのバー 番号または- 1を返すキムから関数を取りました。

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

この関数を呼び出して、条件を書くと

if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {

      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь

         ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
      SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
      modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
      }

Printを 見ると、この関数は-1を返しています。最初は注文がないと思いましたが、しばらくすると注文が再び現れ、同じバーでストップの後に取引が開始されました。

 
こんにちは。MT4とMT5で、1つの商品のチャートを異なるTFでオーバーレイし、これらのTFのための指標を表示することが可能かどうかご存知ですか?例えば、EUR/USDペアの 3つのチャートを1つのウィンドウに表示し、日足、4時間足、1時間足のTFを表示し、さらにこれらのTFのスライドインジケーターを重ね合わせたいと思います。可能なのでしょうか?よろしくお願いします。