初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 128

 
Anatoliy Ryzhakov:

売り注文がAsk価格で決済される

ちょっと戸惑いますね〜。コードのどこにバグがあるのか指をさすんだ!!!(ログにはORDER CLOSE ERROR 4108とあります。) Thanks in advance!

 

こんにちは、コノヤロー。一年で一番大変な日を過ごしてしまったのでしょうか?本題に入りますか?;=).

EAを描きましたが、全て良好です。しかし、私が理解しているMQLは、MT4環境で動作します。取引所と直接連携するソフトと連携してほしい。他にMQLコンパイラはありますか?そうでない場合、どのような言語でMQLを書き直せば よいのでしょうか?

 
STARIJ:

一区切りついたからには、続けなければならない。

休みはないです。EAが注文を「見れない」理由は何ですか?サーバーと パソコンの時間が違うのですが、もしかしてこれが原因?

 
Anatoliy Ryzhakov: 休みがないんです。EAが注文を「見る」ことができない理由は何ですか?私のサーバーの時間とパソコンの時間が違うのです。

時間は人それぞれ。遠くから急がずに始める。1.OrdersTotal関数で 得られるものを確認します。この値は履歴の設定に依存します:今日、過去3日、先週、・・・お好みで調整してください。 2.次にサイクルを作成し、Alertを 含むすべての注文を出力します。これはデバッグと呼ばれ、プログラマーの仕事の中でも非常に重要な部分です。コードを書くことよりも大切なこと。

 
EAのFreeMarginCheck関数で、誤ってマイナスの数量(ロット)を設定してしまった場合のInvalid Lot Amountエラーの修正方法を教えてください。テスターでエラーメッセージを 出さずに、間違ったロットに関するメッセージを表示させること。

 
STARIJ:

時間は人それぞれ。遠くから急がずに始める。1.OrdersTotal関数で 得られるものを確認します。この値は履歴の設定に依存します:今日、過去3日、先週、...お好みで調整してください。これはデバッグと呼ばれ、プログラマーの仕事の中でも非常に重要な部分です。コードを書くことよりも大切なこと。

ありがとうございました。

 

エキスパートアドバイザーのコードに、SLを設定して一度に3つのトレードを開く方法を教えてください。

以下は私の状態です。

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

OrdersTotal() 関数を使用するようにアドバイスされましたが、私の場合、それは合いません。このように持っています。

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

コンパイルはうまくいき、エラーも出ませんが、私の場合、適切ではありません。

次のようなコードが見つかりました。

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

使えるのかもしれないが、文字列の意味がわからない。このコードを私の条件に合うように書き換えた場合、使用することができますか?

 
Seric29:

エキスパートアドバイザーのコードに、SLを設定して一度に3つのトレードを開く方法を教えてください。

以下は私の状態です。

OrdersTotal() 関数を使用するようにアドバイスされましたが、私の場合、それは合いません。こんな感じで持っています。

コンパイルはうまくいき、エラーも出ませんが、私の場合、適切ではありません。

次のようなコードが見つかりました。

使えるのかもしれないが、文字列の意味がわからない。このコードを自分の条件に合うように書き直せば使えるのでしょうか?

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

pos=0; //オーダーカウンタ

for(int i=OrdersTotal()-1;i>=0;i--) //成行注文を読み込む

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;// 成行注文から選択する。

{

if (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) continue;//EA注文のみを選択(Magicがある場合、任意の通貨ペアで取引される場合)

pos++; //選択されていれば、posを1つ増やす。

}

}

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
とても興味深いフォーラムです。勉強になることがたくさんあります!)
 
Seric29:

EAのコードに、SLを設定できる3つのトレードを同時に開く方法を教えていただけませんか?

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);