初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 404

 

注文の開始と変更の関数のラッパーを書き始めたのですが(これらの演算子からの値の戻りに関する 問題を解決できると思ったからです)、同じ問題があります。

何が問題なのかを説明する(何を書いても、OrderSend, OrderSelex, ModifyOrder からの値の返送に問題がある)。

ラッパーコード.

int start()

{

if (signal == 1)

{

OrderSendX(Symbol(),OP_BUY,0.1,Ask,0,500,500,"123",123,0,Red);

}

return(0)です。

}

//-----------------------------------------------

int OrderSendX (string symbol,int cmd, double volume,double price,int slippage,double stoploss,double takeprofit,string comment),

int magic,datetime expiration,color arrow_color)

{

int err=GetLastError();

err = 0;

bool exit_loop = false;

int ticket = -1;

int Retry = 10;

int cnt = 0;

if(cmd == OP_BUY || cmd == OP_SELL) //注文の種類をチェックする。

{

while(!exit_loop)

{

ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err = GetLastError()。

スイッチ

{

case ERR_NO_ERROR:

exit_loop = trueとする。

が壊れる。

{ case ERR_SERVER_BUSY:

case ERR_NO_CONNECTION:

case ERR_INVALID_PRICE:

case ERR_BROKER_BUSY:

case ERR_TRADE_CONTEXT_BUSY:

cnt++です。

が壊れる。

case ERR_PRICE_CHANGED:

case ERR_OFF_QUOTES:

case ERR_REQUOTE:

RefreshRates()。

を続ける。

のデフォルトになります。

exit_loop = trueとする。

が壊れる。

}

if(cnt>Retry)

exit_loop = trueとする。

if(!exit_loop)

{

Sleep(1000)です。

RefreshRates()。

}

さもなくば

{

if(err !=ERR_NO_ERROR)

{

Print("Error : " + err);

}

}

if(err ==ERR_NO_ERROR)

{

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)。

return(ticket)です。

}

Print("Error opening order after" + cnt + "attempts");

return(-1)です。

}

}

}

 
Leanid Aladzyeu:

注文の開始と変更の関数のラッパーを書き始めたのですが(これらの演算子からの値の戻りに関する 問題を解決できると思ったからです)、同じ問題があります。

何が問題なのか説明してください(何を書いても、OrderSend, OrderSelex, ModifyOrder からの値の返送に問題があります)。

https://docs.mql4.com/ru/trading/ordermodify

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
            if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

OrderModify() は yes , no を返します

OrderModify - Документация на MQL4
  • docs.mql4.com
OrderModify - Документация на MQL4
 

誰も説明できない。

ヘルプを100回コピーして私に見せるのではなく、別の例を試してみましょう。

どのように修正すればよいのでしょうか。 例を使って修正を理解します。

{

SL=NormalizeDouble(Bid-TrailingStop*Point,Digits)です。

if(OrderStopLoss()!=SL)の場合

OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0)を実行。

}

差し込まない

"""チケット """= OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); every time is correct?

 

そして、説明しようとした皆さん、ありがとうございました。

残念ながら、関数としてあらかじめ定義されている変数に指定する方法がよくわからないのです。

 
Leanid Aladzyeu:

そして、説明しようとした皆さん、ありがとうございました。

残念ながら、関数としてあらかじめ定義されている変数に指定する方法がよくわからないのです。

リーニッド 様ヘルプを読み、エラーや警告に対処することを学ぶ。その方法を学ばなければ、まともにプログラミングもできない。これらは基本中の基本です。警告に書かれていることを翻訳してみましたか?チェックが必要」な機能の意味を理解していますか?ヘルプには、これらの機能を扱う正しい例が記載されています。例えば、OrderModify()。ヘルプを見てください。

戻り値

関数が正常に終了した場合はtrueを、エラーが発生した場合はfalseを返す。エラーの情報を得る には、GetLastError()関数を呼び出す必要が あります

というように、例を挙げて説明します。

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
   Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
   Print("Цена Stop Loss ордера успешно модифицирована.");

ご覧のように、関数の戻り値はif-else演算子で処理されます。res変数が「美しさのために」必要なのには理由があります。取引 機能を実行した結果です! あなたのお金がかかっている機能ですしたがって、起こりうるすべての variant を正しく処理するためには (この例での処理は提供されていません)、 res 変数と GetLastError() 関数が返すエラーコードが必要です。開発者は、値の処理に注意を払うべき「重要な」関数があることを忘れないように、意図的に警告を含んでいます!また、値がチェックされていない場合は、エラーが発生しないことに注意してください。すなわち、この場合、機能はそのまま動作しますが、異常事態が発生した場合は、処理されません。非標準状況のリストは、GetLastError()関数のリターンコードである。

このように分かりやすくなるといいですね。

Коды возврата торгового сервера - Документация на MQL4
  • docs.mql4.com
Коды возврата торгового сервера - Документация на MQL4
 
Leanid Aladzyeu:

注文の開始と変更関数のラッパーを書き始めたが(これらの演算子から値を返す 問題が解決されると思った)、同じ問題がある。

そしてこの場合、ラッパーを書く必要はありません。戻り値チェックの警告で問題解決しない!これらの関数の例を見て、同じようにやってみてください
 
Tapochun:
そしてこの場合、ラッパーを書く必要はない。戻り値のチェックで警告が出るのは解決しない!これらの関数の例を見て、同じようにしてみてください。

参考文献にあるように、エラーが出ます。

このように書いたので大丈夫です

if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))

{

Print("修正に成功しました。");

}

else Print(" 注文の修正に失敗 しました。");

 
投稿にコードを正しく挿入する:フォーラムにコードを正しく挿入 する
 
Karputov Vladimir:
投稿にコードを正しく挿入する:フォーラムにコードを正しく挿入 する
はいどうぞ
 
Leanid Aladzyeu:

なぜTrawlingは販売に使えないのか、購入には使えるのに

遺伝子のコンパイルで、エラーや警告はありません。

以下はそのコードです。

void Trailing()
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }