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

 

こんにちは。

MT4でEAを取引する際に、どのようにコードを正しく書けばよいのか、プログラミングの初心者ですが、アドバイスをお願いします。

最後に決済された注文を選択して、その利益を比較しなければなりません。 その利益が0より大きい場合は何もせず、0より小さい場合は何かをしなければならないのです。

double GetSizeLot(double lastlot=0) //Функция возвращает значение лотов 
  {
   double Lot2,MinLots,MaxLots;
   int j=OrdersHistoryTotal();
   
   MinLots=Lots;
   MaxLots=MaxLot;
   if(!DynamicLot)Lot2=Lots;
   if(lastlot<Lot2)lastlot=Lot2;
   
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY))
     {
     if(OrderProfit()<0) lastlot=lastlot*Martin;
     if(OrderProfit()>0) lastlot=Lot2;
     }
   Lot2=lastlot;
   if(Lot2 < MinLots) Lot2 = MinLots;
   if(Lot2 > MaxLots) Lot2 = MaxLots;
   return(NormalizeDouble(Lot2,2));
  }

尊敬していますよ、アレクサンダーさん。

 
Menshikov:

こんにちは。

MT4でEAを取引する際に、どのようにコードを正しく書けばよいのか、プログラミングの初心者ですが、アドバイスをお願いします。

最後に決済された注文を選択して、その利益を比較しなければなりません。 その利益が0より大きい場合は何もせず、0より小さい場合は何かをしなければならないのです。

尊敬していますよ、アレクサンダーさん。

//+------------------------------------------------------------------+

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      if(OrderSymbol()==_Symbol)
         if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
            if(OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               profit=OrderProfit();  // запомним профит
               his_lt=OrderLots();    // запомним лот
              }

if(profit<0) //если профит меньше нуля
   lots=his_lt*2; // Увеличим в два раза

//+------------------------------------------------------------------+
 
Vladimir Pastushak:
ありがとうございました。
 
Vladimir Pastushak:
時間は何のためにあるのだろう、どうせリストの最後のものを選ぶのなら、なぜ閉店時間を覚えているのだろう、サイクルはどうなっているのだろう。そして、スワップやコミッションを検討してはいかがでしょうか。OrderProfit()>0であっても、実際の利益はマイナスになる場合があります。注文のリストを直接操作する場合、クローズの時間までに最後の1つを検索するループからコードのチャンクを残してはいけません。ひとつは信頼性・確実性、もうひとつはスピードです。そして、寄せ集めがあるんですね。
 
Artyom Trishkin:
時間は何のためにあるのだろう、どうせリストの最後のものを選ぶのなら、なぜ閉店時間を覚えているのだろう、サイクルはどうなっているのだろう。そして、スワップやコミッションを検討してはいかがでしょうか。OrderProfit()>0であっても、実際の利益はマイナスになる場合があります。注文のリストを直接操作する場合、クローズの時間までに最後の1つを検索するループからコードのチャンクを残してはいけません。ひとつは信頼性・確実性、もうひとつはスピードです。あなたが持っているのは、ごちゃごちゃしたものです。

あなたが言いたいのは、次のことです。

   if(OrderSelect(OrdersHistoryTotal(),SELECT_BY_POS,MODE_HISTORY))

しているのでしょうか?

相手は利益命令を出しただけなのに、なぜ頼んでいないことを押し付けるのか?しかし、私はあなたに同意します....

 

MT4でMQL4のオープンオーダーを20バー後にクローズする方法、つまり、オーダーがオープンされ20本の新しいバーが表示されたら、それをクローズする方法を教えてください。(注文は常に1件のみ)。何らかの理由で、このコードはストラテジーテスターで 動作しないので、そのために必要なのです。


このコードは次のような意味を持っています。未決済の注文があるかどうかを調べ、なければ注文を出し、1本目のバーのオープン価格を「z」変数に記録し、その後1ティックごとに20本目のバーのオープン価格を調べ、1本目が最終的に20本目に到達するとその価格は「z」変数に記録した価格と同じになって、注文は決済されます。(もちろん、プロセス中に、価格が一致することができますが、それは非常にまれであろう、加えて、我々は変数に1番目のバーのより多くのパラメータを書き込むことができます)。


double z; //объявление переменной

           //ОТКРЫТИЕ ОРДЕРА
           if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер
              {
               OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+150*Point, Bid-10*Point);
                   z = Open[1]; // здесь переменной "z" присваивается цена открытия 1-го бара
              }
            else

           Print("ORDER NE USTANOVLEN!!!");




           //ЗАКРЫТИЕ ОРДЕРА

    if (z==Open[20])  //если цена записанная в переменную "z" равна цене 20-го бара, то закрывать ордер
        {
           

            //-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
         
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());

  }
//------------конец кода закрывающего ордер------------------
           
           
        }
      else
      Print("ORDER NE ZAKRYT!!!");
 
BEGEMOT32:

MT4でMQL4のオープンオーダーを20バー後にクローズする方法、つまり、オーダーがオープンされ20本の新しいバーが表示されたら、それをクローズする方法を教えてください。(注文は常に1件のみ)。何らかの理由で、このコードはストラテジーテスターで 動作しないので、そのために必要なのです。


このコードは次のような意味を持っています。未決済の注文があるかどうかを調べ、なければ注文を出し、1本目のバーのオープン価格を「z」変数に記録し、その後1ティックごとに20本目のバーのオープン価格を調べ、1本目が最終的に20本目に到達するとその価格は「z」変数に記録した価格と同じになって、注文は決済されます。(もちろん途中で価格が一致することもありますが、それは非常にまれなことで、さらに、1本目のバーのパラメータを変数に書き込むことができます)。


それです、私は自分でそれを理解しました、私はint start()の外で変数を宣言するべきだったのです - 今それはうまく動作します。
 
BEGEMOT32:
それだ、自分でわかったんだ、int start()の外で変数を宣言すべきだったんだ - 今はうまくいくよ

あなたのコードを少し簡略化しましたが、まだエラーがあります。

//ОТКРЫТИЕ ОРДЕРА
if(OrdersTotal()==0) // если нет открытых ордеров то открывать ордер
   if(OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+150*Point,Bid-10*Point)<0)
      Print("ORDER NE USTANOVLEN!!!");

//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;
   while(OrdersTotal()>0)
     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         if(iBarShift(OrderSymbol(),Period(),OrderOpenTime())==20)
           {
            if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
               OrderDelete(OrderTicket());
           }
         if(result!=TRUE)
           {
            error=GetLastError();
            Print("LastError = ",error," ",Symbol());
           }
         else error=0;
        }
      else Print("Error when order select ",GetLastError());

     }
 

多通貨EAを書いているが、異なる通貨にリンクさせると同時に異なる価格を返してくるのが理解できない

要するに、コードです。

at Init

EventSetTimer(60);

OnTimer()内

MqlTick last_tick;
if(SymbolInfoTick("EURNZD",last_tick))
{
    Print("Last Ask: ", last_tick.ask);
}

例えば、EURNZDでEAをテストする場合。

2015.05.18 00:07:00Lat Ask: 1.5370

他の通貨ペアを使用する場合

2015.05.18 00:07:00Lat Ask: 1.5323

この値は全く異なっており、2番目のケースでは、チャートによると、少なくとも数時間はそのような値が存在することはあり得ません

Strategy Testerでは全てのティックがトレードモードになっているので、メインペアでない場合はStrategy Testerの値はおおよその値になっている気がします

追記し忘れましたが、これはメタトレード5 です

一度目は価格がおかしく、二度目は正常な価格であることがわかりました

 
1.ティックボリュームが 何回上下したか、履歴からわかるか?

2.autochartisを削除してから数ヶ月経ちますが、ログメッセージが出続けています。ソフトがファイルを開こうとし続ける。

オートカルティスを完全に消去する方法は?

2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Volatility.ex4' [2]
2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Key Levels.ex4' [2]
2015.05.25 15:36:42.982 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Chart Patterns.ex4' [2]

理由: