キャンドルオープンの確認 - ページ 3

 
  1. コードはビルド600以前に書かれたものです。2014年2月以降、変数名にドットが使えなくなった。アンダースコアに置き換えるだけです。
  2. 以下は方向性に依存しないコードの例です。
    double DIR, OOP, OCP, ISL;  int OP;
    
    if(     Bid > High[1]){
       DIR = +1; OOP = Ask; OCP = Bid; OP = OP_BUY;
    }
    else if(Bid <  Low[1]){
       DIR = -1; OOP = Bid; OCP = Ask; OP = OP_BUY;
    }
    else return;
    
    ISL = OCP -DIR* pips_to_change( extISL_Pips );
    ... OrderSend(...);
    始値/終値は Ask/Bidを入れ替えるだけで、あとは全て買いであるかのように書きます。ISLはOCPより下(OCP - ISL)、-DIR*は売りの符号に変更します。
    もし比較(A > B )が必要なら、(A - B)*DIR> 0 を使って、売りのために比較を逆転させることができます。
 
GumRai:

アイデアがあるようですね。

コードを修正して投稿してください。私か他の誰かがコメントします。

こんにちは、GumRaiです。

しばらく更新が滞っていましたが、10時間労働でようやくコードを完成させることができました。しかし、2つの大きな問題があります。1) 何をやっても、エラーコードが 発生します。「2)私は、異なるマジックナンバーなどを使用して、(1つのUSDCADと別のEURUSDを呼び出した)ファイルの保存-ASをしました、まだそれは一度に唯一の取引を取り、ペアを独立して扱うことはありません。実際、"Invalid ticket for OrderCloseFunction "というエラーも発生します。

ググってみましたがダメでした。この件に関して正しい方向に導いていただけると本当に助かります。私は何を間違えているのでしょうか?

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//part with the extern int stating the terms of the MA removed to reduce space.

int MagicNumber = 1234;
int MagicNumber2 = 2345;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double Ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (Ticksize == 0.00001 || Ticksize == 0.001)
   Pips = Ticksize*10;
   else Pips = Ticksize;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
//---

   static datetime bar_time=0;
  if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);
      double PreviousPriceClose2=iClose(NULL,0,2);
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      for(int i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(iClose(NULL, 0,0)<PreviousSlow)
        {
          CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         }
         }
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
      for(i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if(iClose(NULL, 0,1)>PreviousSlow)
        {
          CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              }
     }
     }
    return(0);
    return(0); 
    }
//--------------

  

ありがとうございました。

 

OrdersTotal()==0を トレードの条件として使用しないでください。

これは、手動、他のEA、または同じEAが他のチャートシンボルに接続されている場合、1つの取引しか開くことができないことを意味します。

グローバル変数 BuyTicket を -1 に初期化します。

int BuyTicket=-1;

      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),
                                "Main Entry EA",MagicNumber,0,clrLimeGreen);
        }

クローズする前に注文をループさせないでください。

else
if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
  {
   if(OrderCloseTime()==0)
     {
      if(Close[0]<PreviousSlow)
        {
         bool  CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         if(CloseTicket)
            BuyTicket=-1;
        }
     }
   else
      BuyTicket=-1;  //Order has closed so reset variable
  }

さて、グローバルに宣言された変数をチケット番号に使用する場合、何らかの理由でターミナルがシャットダウンされ、再起動された場合、問題が発生することがあります。

そこで、新しいグローバルスコープの変数を宣言します。

 bool Recovery=true;

  
  if(Recovery)
     {
     //loop through open orders and check for magic number, symbol and type
     //if you find a buy order with the magic number and symbol
     BuyTicket=OrderTicket();
     //if you find a sell order with the magic number and symbol
     SellTicket=OrderTicket();
     Recovery=false;
     }

素早く入力したので、間違いがあるかもしれませんが、アイデアを与えるには十分です。

 
GumRai:


ありがとうございます!私がループをそこに置いた理由は、私が気づいたことは、それが売りを閉じたとき、それは何らかの理由で買いをトリガしないことでした。

私は先に進み、必要な変更を加えました...しかし、まだ何かが不都合なようです。現在、ロングトレードはしておらず、無効なチケットのエラーコードと OrderCloseエラー4051を発生させています。何がまだ間違っているのか、何か提案はありますか?

不思議なのは、前のコードでも、今のコード(売りだけ)でも、(1つのチャートにしか実装していなければ)それなりにうまくトレードが取れていたことです。

これって、そんなに難しいことだとは思いませんでした。ローソクがクロスしてMAより上で開いたら買い、ローソクがクロスしてMAより下に行ったら決済して売り、という非常にシンプルでわかりやすいものだと思っていたのが間違いだったようです。


if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;
            }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;
            }
            
    return(0);
    return(0); 
    }
 

申し訳ありませんが、あなたが何をしようとしているのか、本当にわかりません。

if(OrderSelect(SELECT_BY_POS,MODE_TRADES))

どのような順序でも選択されません。コードはコンパイルできるのか?

      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;

ここでelseが適用されるのは if(OrderCloseTime()==0) が false の 場合です。

       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;

ここではOrderSelectが失敗した場合に適用されます。それは確かにそうです。

 
GumRai:

申し訳ありませんが、あなたが何をしようとしているのか、本当にわかりません。

どのような順序でも選択されません。コードはコンパイルできるのか?

ここでelseが適用されるのは if(OrderCloseTime()==0) が false の 場合です。

ここではOrderSelectが失敗した場合に適用されます。それは確かにそうです。

すみません、完全に私のミスです。ご指摘いただきありがとうございます。こちらは正しく実行しました。レポートには全くエラーは発生していません。ただ今は、複数の売り注文と買い注文 を入力するタイミングがあり、適切なタイミングで取引を終了することができません。

編集:正確には、価格がMAの反対側を横切ったときではなく、SLとTPで終了しているだけです。これはboolと関係があるのでしょうか?

int start()
  {
   static datetime bar_time=0;
  if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
      else
      if(OrderSelect(BuyTicket,MODE_TRADES))
      {
         if(OrderCloseTime()==0)
         {
          if(Close[0]<PreviousSlow)
           {
             bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
             if(CloseTicket)
               BuyTicket=-1;
               }
            }
            else
               BuyTicket= -1; //Order has closed so reset variable
               }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SellTicket,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else 
            SellTicket= -1; //Order has closed so reset variable
            }
    return(0);
    return(0); 
    }
 
if(OrderSelect(BuyTicket,MODE_TRADES))
これは取引を選択するものではありません、私があげた例に従って、正しく行ってください
 
GumRai:
これはトレードを選択するものではありません、私があげた例に従って、正しく行ってください

なんか...本当にバカみたいです(笑)。見つけてくれてありがとうございます!

1)残り2つ・・・OrderClose 4108のエラーコードが 発生するようになりました。もう一度、コードを掲載しましょうか?上記と同じで、ご指摘の修正を加えたものです。ルール通りにエントリー、エグジットしていますが。

2) そして、写真のようにロングポジションを閉じたらすぐにショートに入るわけではありません。緑色の下向き矢印は、ショートするべきだったところを示しています。買いポジションを持ち、黄色のMAを下回って引けた時点で損切りしています。ここで、空売りをするべきだったのです。これをループさせるにはどうしたらいいでしょうか?

GumRaiさん、どうもありがとうございます。正直、あなたの助けがなければ、ここまでたどり着けなかったと思います。

ここでショートすればよかった

 
int start()
  {
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }

      if(SellTicket==-1)
        {
         if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
           {
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(SellTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]>PreviousSlow)
              {
               bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
               if(CloseSellTicket)
                  SellTicket=-1;
              }
           }
         else
            SellTicket=-1; //Order has closed so reset variable
        }
     }
   return(0);
  }

注文がないときに注文を閉じるようにチェックして いたので、小さな変更です。

コードによると、買いが終了した直後に売りが開始される理由はありません。

買いを終了する条件と、売りをオープンする条件は同じではありません。

ローソク足が開いた時だけチェックしているので、Close[0]はそのローソク足で最初に受信したティックの買値になることを思い出してください。

 
GumRai:

注文がないときに注文を閉じるようにチェックしていたので、小さな変更です。

コードによると、買いが終了した直後に売りが開始される理由はありません。

買いを終了する条件と、売りをオープンする条件は同じではありません。

ローソク足が開いた時だけチェックしているので、Close[0]はそのローソク足で最初に受信したティックの買値になることを思い出してください。

やったー!やったね!GumRaiさん、何度も何度もありがとうございます。あなたは最高です。

今はフォワードテストできないけど、マーケットが開いたら、デモのマジック#が違えば、他のペアでも使えると思うんだ。