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

 
GumRaiさん、ありがとうございます。
 

こんにちは。


数種類の通貨チャートにEAを取り付けています。このEAは条件を満たした場合、一つのチャートに多くの注文を出します。1つのチャートに1つしか注文を出さないようにするには、どのようなコーディングが必要でしょうか?

 
chuale:

こんにちは。


数種類の通貨チャートにEAを取り付けています。このEAは条件を満たした場合、一つのチャートに多くの注文を出します。1つのチャートに1つの注文しか出さないようにするには、どのようなコーディングが必要でしょうか?


注文をループさせ、マジックナンバーとシンボルをチェック します。

すでに注文が開いている場合は、それ以上開かないようにします。

PS.あなたの質問はスレッドのタイトルと全く関係がないので、あなたは本当に新しいスレッドを開始する必要がありました :)

 
chuale:

thrdelさん、こんにちは。

Time[0]はバー0の時刻を指しているのでしょうか?Time[1]、Time[2]などはあるのでしょうか?ググってみましたが、ネット上ではあまり情報がありません。また、このEAを2つの通貨ペアにつけた場合、OrderSelectはチャート自体の注文のみを選択するのか、それともターミナルにある全ての注文を選択するのか、どちらでしょうか?




Time[0]は現在の バーが開始された時間 です。はい、Time[1]は前のバーが開始された時間、といった具合です。

同じEAを複数のチャートで動作させる場合、同じシンボルを異なるチャートで使用する場合でも、EAごとに「MagicMunber」変数が異なっていることを確認する必要があります。

そうすれば、EAがお互いの注文に干渉することはありません。

OrderSelect() はチャートからではなく、サーバーから値を取得します。

口座や注文の情報はサーバーに保存されているので、パソコンの電源を切ってもストップやTPの注文は実行されているのです。

 
chuale:

こんにちは、thrdelさん。


"if(ticket<0)Print("Error OP_BUY order failed, error: "+GetLastError());" というコーディングに対して "implicit conversion from 'number' to 'string' postin forum.mq4 69" という警告メッセージが表示されるのはなぜでしょうか?


Comment()でdouble変数を表示したり、Print()で印刷する場合は、DoubleToString()関数で 文字列に変換する必要があります。

int型変数では、変換は明白なので、IntToString()を使って変換しなくても、コンパイルして動作します。

 
chuale:

こんにちは。


私はいくつかの異なる通貨のチャートにEAを添付します。このEAは条件を満たせば1つのチャートにたくさんの注文を出します。1つのチャートに1つの注文しか出さないようにするには、どのようなコーディングが必要でしょうか?


こんにちは、Chualeさん。

あなたのEAを動作させるために、いくつかの変更を加えました。

MagicNumberは変数で、すべてのチャートで異なることを確認する必要があります。

もし、この変更がなぜ、どのように機能するのか説明して欲しいのであれば、私にPMしてください。

自分でテストを行い、どのように機能するかを見ることができます。私はUSDJPYでテストしました。

最大と最小の変数は、あなたの条件の値1と-1を置き換えているので、あなたは最適化することができ、他の値がよりよく動作するかどうかを確認します。


if(bar2 <-1) //changed to 
if(bar2 < Min
if(bar2 > 1) //changed to 
if(bar2 > Max

パラメータを最適化 する方法をご存知ですか?

あなたが何か質問がある場合は、私に知らせてくださいまたはPM。

以下はそのコードです。

//+------------------------------------------------------------------+
//|                                                 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=150;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      Max = 6;
extern int      Min = -9;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
double     bar3max,bar3min;
int        myTrades,ticket;
datetime   previousTime;
int        xMultiply;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---
if(Digits==3) xMultiply=100;
if(Digits==5) xMultiply=10000;
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
 
   myTrades = CountTrades();
//
   bar1=(iClose(Symbol(),0,2)-iClose(Symbol(),0,3))*xMultiply;
   bar2=(iClose(Symbol(),0,1)-iClose(Symbol(),0,2))*xMultiply;
   bar3=(iClose(Symbol(),0,0)-iClose(Symbol(),0,1))*xMultiply;
   //
   if(myTrades>0)
     {
      if(bar3<Min) CloseThisSymbolAll("OP_BUY");
      if(bar3>Max) CloseThisSymbolAll("OP_SELL");
     }
  //
   if(Time[0]==previousTime) return(0);    
   previousTime=Time[0];          
   //
   if(myTrades<1)
     {
      if(bar2>1)
        {
         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()); 
         return(0);
        }
      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(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(string direction)
  {
  string dir = direction;
   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 && dir == "OP_BUY")OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL&& dir == "OP_SELL")OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
     }
  }
//========================================================================
 

こんにちは、thrdelさん。


あなたはとても親切で助けになります。ありがとうございます。

 

Thrdelさん、こんにちは。

つまり、バックテスト ごとにMaxとMinの値を変えてみて、どれが一番最適な値なのかを判断しなければならないということでしょうか?

ありがとうございます。