MQL5で学び、共に書く - ページ 24

 

この機能は何をするものなのか、誰の目にも明らかなのでしょうか。

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResult my_trade_result;

my_trade.action=TRADE_ACTION_DEAL;

my_trade.symbol=Symbol()。

my_trade.volume=NormalizeDouble(volume,1)となります。

my_trade.price=NormalizeDouble(Bid,_Digits)。

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits)です。

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits)です。

my_trade.deviation=slippage。

my_trade.type=ORDER_TYPE_SELLです。

my_trade.type_filling=ORDER_FILLING_AON。

my_trade.comment=コメントです。

my_trade.magic=magic;


ResetLastError()。

if(OrderSend(my_trade,my_trade_result))です。

{

time_oc=TimeLocal()です。

md=0とする。

Print("操作結果 コード - ",my_trade_result.retcode);

}

さもなくば

{

Print("操作結果コード - ",my_trade_result.retcode);

Print("オーダーオープンエラー = ",GetLastError());

}

return(0)です。

}

OnTick()プロシージャで

...

OpenSell(Lots,10,「EUR/USD (Sell)」,102406)。

...

一番最初にね。

double StopLoss=250,

TakeProfit=1400。

extern double Lots = 0.1;

なんでテスト結果に220ドルも入ってるんだ?

<日付> <残高> <エクイティ> <マージンレベル

01,01,2010 0 :00:00 10000 10000 0

11,01,2010 2 :57:00 9779,29 9841,92 6827

15,01,2010 16:00:00 9829,8 9941,9 6857

22,01,2010 14:32:00 10124,1 10135,9 7167

26,01,2010 2 :14:00 10048,6 10048,6 0

26,01,2010 4 :06:00 10048,6 10038,4 7099

27,01,2010 21:12:00 10188,5 10188,5 0

29,01,2010 2 :16:00 10188,5 10308 7346

29,01,2010 7 :14:00 10188,5 10277,4 7324

04,02,2010 22:05:00 10418,63 10480,83 7592


もし私が間違っていたら、鼻を突いてください。

EAの全貌はお見せできません。購入時の機能は同様です...

逆の注文でポジションをクローズする。

 

わかりました。大声で叫んでしまったただ、言葉を覚えるだけ。もし、気を悪くされた方がいらっしゃいましたら、申し訳ありません。働いて問題を探します。自分でもやっていることかもしれませんが、mql5を使って良いEAを作る方法をどうしても知りたいのです。とても良いシステムだと思いますが、.今のところ問題がありますね。

mql4で20のExpert Advisorを問題なく使用できていますが。

 
Khomtchenko:
...
このような不明な数字ではなく、当該期間の取引履歴 を示した方が良いのではないか。そうすれば、その損失がどこから来たのかが明確になるかもしれません。
 

ファイル操作」の項目を少しずつ勉強するようになりました。MQL5でファイルを扱う方法について、チュートリアルがあるかどうかご存知ですか?

 

あるモードの注文をすべて削除したいのですが、正しい方法はありますか?

そのための関数として、check_ordersは特定のモードを持つ注文をチェックし、remove_slはそれらを削除する、という2つの関数を持っています。

void remove_sl()
     {
      int counter01;
      ulong counter02;
      while(check_orders()==true)
        {
         for(counter01=0; counter01<OrdersTotal(); counter01++)
           {
            counter02=OrderGetTicket(counter01);
            if(OrderGetInteger(ORDER_MAGIC)!=magick)
               continue;
            remove_request.action=TRADE_ACTION_REMOVE; remove_request.order=counter02;
            if(OrderCheck(start_request,check_result)==true)
               OrderSend(start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
      int counter01;
      bool order_exist=false;
      for(counter01=0; counter01<OrdersTotal(); counter01++)
        {
         OrderGetTicket(counter01);
         if(OrderGetInteger(ORDER_MAGIC)==magick)
           {
            order_exist=true;
            break;
           }
        }
      return(order_exist);
 

問題は、EAのジャーナルで、このような行が表示されることです。

2011.05.11 21:40:19 トレード '726238' : 注文のキャンセルに失敗 #4375237 0.00で買い 0.00000 [無効なリクエスト]である。
つまり、すでに送信された注文の削除依頼をトレードサーバーに重複して送信している。

 

ポジションのクローズとオープンに問題があるように思います。

どういうわけか、0.1ロットのポジションを持つのではなく、実際には数ロットのポジションを持っているのです。どうやら1つのシンボルのポジションが重なり、そのボリュームが大きくなっているようです。上記のストップ値が大きい、テスト時に大きな差が出るという問題を説明するには、この方法しかないでしょう。オープントレードの存在を間違って分析していたり、トレールを間違って閉じていたりということです。

これは、私がシンボルによってオープンポジションがあるかどうかを判断するために使用する手順です。

int Total()

{

count=0とする。

for (i=0; i<=PositionsTotal(); i++)

{

if (PositionGetSymbol(i)==_Symbol) {count++;}.

}

return(count)です。

}

もちろん、この関数は0か1のどちらかを返します。

私は、以下のようなエントリーで注文を開始しています。

if (Total()<1)

{

if (# some check on indicators#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);

if (#some check on indicators#) OpenSell(Lots,10, "EUR/USD (Sell)",102406);

}

私は購入と売却を開いているように見えます。

int OpenSell(double volume,int slippage=10,stringコメント="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResult my_trade_result;

my_trade.action=TRADE_ACTION_DEAL;

my_trade.symbol=Symbol()。

my_trade.volume=NormalizeDouble(volume,1)となります。

my_trade.price=NormalizeDouble(Bid,_Digits)。

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits)です。

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits)です。

my_trade.deviation=slippage。

my_trade.type=ORDER_TYPE_SELLです。

my_trade.type_filling=ORDER_FILLING_AON。

my_trade.comment=コメントです。

my_trade.magic=magic;


ResetLastError()。

if(OrderSend(my_trade,my_trade_result))です。

{

time_oc=TimeLocal()です。

md=0とする。

Print("操作結果 コード - ",my_trade_result.retcode);

}

さもなくば

{

Print("操作結果コード - ",my_trade_result.retcode);

Print("オーダーオープンエラー = ",GetLastError());

}

return(0)です。

}

同じようにメイン手順でトレードをクローズしています。

if (Total()>0) TryToClose()。

TryToCloseはこのようなものです。

int TryToClose()
{
for (i=0; i<=PositionsTotal(); i++)
{
if (PositionGetSymbol(i)==_Symbol)とする。
{
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)とする。
if(# some indicator check#) OpenSell(Lots,10, "EUR/USD (Sell)",102406)
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)です。
if(# some indicator check#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);
}
}
return(0)です。

}

この指標は、買いポジションがあるはずなのに、売りポジションがあれば、買いを行うことをチェックするものです。

間違えたところ。なぜポジションが肥大化するのか。

 
Khomtchenko:

SRCボタンでコードを挿入する

Будет читабельнее
MT4注文とMT5注文の違いをご存知ですか?
 

mql4では、注文は取引か保留かのどちらかです。

mql5では、注文は保留中の取引です。市場への参入とは、ポジションを開く ことです。注文がトリガーされると、ポジションが開設されます。1つのシンボルに対してポジションは1つしかなく、オーダーはいくつでも可能です。

Спасибо за подсказку
 

みんなにバカにされ続けている。私は頭が悪いのかもしれません。では、私の間違いを見つけて、訂正します。

 
Khomtchenko:

なんだか、バカの一つ覚えのような気もするけど。私はバカかもしれません。では、私の間違いを見つけて、それを訂正できるようにしてください。

何もほのめかしているわけではなく、ただ駆け足で「何が一番多いですか」と聞いただけなので、あなたのレベルがわかりません。

私はここに長くいて、すでに多くの人について意見を形成しています(みんなそれなりに強いです)、私はまだあなたのことを知らないので、何もほのめかすつもりはありません。


戦略の全体像が見えない。ポジションの取り方からして、戦略は多通貨ですね。

しかし、ツールは1つしか規定していないのですね。ツールは1つなのに、なぜポジションを循環させるのでしょうか?

楽器がわかっていれば、すべてのポジションに目を通して探す必要はなく、この機能を使うだけでいいのです。

bool  PositionSelect(
   string  symbol     // имя инструмента
   );
理由: