OrderCloseが機能しない - ページ 2

 
chuale:

皆さん、こんにちは。


現在、OrderTicket()とOrderLots()を使わずにOrderCloseでチケットとロットを挿入していますが、注文も閉じられません。助けてください。



あなたが間違っていることがいくつかあります。このEAをM1時間軸のJPYペアで動作させたいのだと思います。新しいバーだけに注文を出して、新しいバーだけで決済したいのか、それとも新しいバーでエントリーして条件が揃ったら終了したいのか?私が思うに、次のようなことです。

まず、OrdersTotal()で注文を数えます。

次に変数を計算します。

市場に注文がある場合、それらがクローズされなければならないかどうかをチェック します。

市場に注文がない場合、エントリー条件が満たされているかどうかをチェックする。

もし何か質問があれば教えてください。

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
int        total,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   total=OrdersTotal();
/*
  counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
  IndicatorCounted() is actually for indicators not EA
  
   */

   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
   /*
   Comment("Bar1 = "+DoubleToString(bar1,Digits)+"\n"+
           "Bar2 = "+DoubleToString(bar2,Digits)+"\n"+
           "Bar3 = "+DoubleToString(bar3,Digits)+"\n"
           );
   */
//Close any orders if conditions are met
   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(total<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
ファイル:
 
GumRai:


チケットはローカル変数なので,次のティックでは同じ値にはならない

関数の外に置いて、Globalscopeに する。

 
   total=OrdersTotal();

?役立たず。

自分の持っているトレードを正しくチェック する

正しいシンボルと正しいマジックナンバーを探す

オーダーループを使えば、正しい取引を選択してクローズすることができます。

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);

.

あなたの方法では

PCを再起動した瞬間にチケットの価値がなくなるので

   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }

失敗した......

 
chuale:

なぜ、私の記事を引用しておいて、コメントをつけないのですか?
 
チケット番号はティックに応じて変化することがわかりました。OrderTicket()を使用しなければならないのでしょうか?
 
chuale:
チケット番号はティックに応じて変化することがわかりました。OrderTicket()を使うしかないのでしょうか?

もしOrderTicket()を使うなら、まずOrderSelect() を使って、決済したい取引がそれであることを確認します。
 
chuale:
チケットナンバーはティックに応じて変化し続けるということですが、オープンオーダーのチケットナンバーはどのように取得するのですか?OrderTicket()を使うしかないのでしょうか?


Chualeさん、こんにちは。

シンボルとマジックナンバーで注文と決済を選択する簡単な方法です。

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
int        myTrades,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   myTrades = CountTrades();//Count trades function counts this EA trades only
//
   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;

//Close any orders if conditions are met
   if(myTrades>0)
     {
      if(bar3<-1) CloseThisSymbolAll();
      if(bar3>1) CloseThisSymbolAll();
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(myTrades<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",MagicNumber,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",MagicNumber,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//========================================================================
int CountTrades()
{
int count=0;
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber)
   continue;
   if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
   if(OrderType()==OP_SELL || OrderType()==OP_BUY)
   count++;
   }
return(count);
}
//========================================================================
void CloseThisSymbolAll()
  {
   int trade;
   for(trade=OrdersTotal();trade>=0;trade--)
     {
      OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
      //Sleep(1000);
     }
  }
//========================================================================
 
chuale:
チケット番号がティックに応じて変化するのは分かったのですが、オープンオーダーのチケット番号はどのように取得するのでしょうか?私はOrderTicket()を使用しなければならないのでしょうか?


また、こんにちはChuale。

私はUSDJPYであなたのアイデアで遊んでいたのですが、いくつかの変更なしに肯定的な結果を得ることができませんでした.ここにM1チャートのUSDJPYで私の結果のサンプルがあります。

M1のUSDJPY

別のペアで使うつもりだったのですか?

bar3 < -1 や bar3 > 1 で終了しても良い結果は得られませんでした。

 
deVries:

?役立たず。

自分の持っているトレードを正しくチェックする

正しいシンボルと正しいマジックナンバーを探す

オーダーループを使えば、正しい取引を選択してクローズすることができます。

.

あなたの方法では

PCを再起動した瞬間にチケットの価値がなくなるので

失敗します。


注文を閉じるのに最適な方法ではないという意味なら同意しますが、OrderSelectを使 いたくない(あるいは使い方を知らない)人が、マーケットにオープンオーダーを残さないのであれば、有効な方法だと思います。

私たちはここでお互いに助け合おうとしますが、あなたの回答は少しも役に立ちませんでした。あなたは注文選択機能の使い方を彼に示さず、あなたのコメントのために彼のEAが今より良く動くことはないのです。

次回は、正しい方法で、正しいコードを入れて、他の人が実際に何かを学ぶことができるように、助けてあげてください。

 
thrdel:


いくつか間違っている点があります。このEAをM1時間軸のJPYペアで動作させたいのだと思います。新しいバーだけに注文を出して、新しいバーだけで決済したいのか、それとも新しいバーでエントリーして条件が揃ったら終了したいのか?以下は私が考えていることです。

まず、OrdersTotal() で注文を数えます。

それから変数を計算します。

市場に注文がある場合は、それらが決済されなければならないかどうかをチェックします。

市場に注文がない場合、エントリー条件が満たされているかどうかをチェックします。

何か質問があれば教えてください。