2EMAのクロスEAを作成したのですが、アドバイスが必要です。 - ページ 3

 
deVries:


現在のスプレッドでテストした場合、これは非常にクレイジーな動きをしているので、スプレッドは非常に大きくなる可能性があります。

どのようにテストしたのですか?

固定スプレッドか現在のスプレッドか?


OK、この時こそ「スプレッド」でググってみよう。

私のくだらない質問に答えてくれてありがとうございます))

私はしばらくして戻ってきます。

 
prupru:


そうそう、こういう時こそ "拡散 "でググりましょう。

私のくだらない質問に答えてくれて感謝します))

しばらくしたらまた来ます

スプレッド = アスク - ビッド
 

そして、この値は刻々と変化することができる

なぜかというと、このテストはどのように行われたのか、その方法を尋ねたからです。

 
deVries:

そして、この値は刻々と変化することができる

というわけで、このテストはどのように行われたのでしょうか?

その通りです。

私は、違いは、現在のスプレッドのテストのためだった、私は固定スプレッドでテストを実行したとき、彼らはまったく同じだった!

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

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

また、コードに何か改善すべき点があれば教えてください。

 
prupru:

ということです。

私は、この違いは現在のスプレッドのテストによるもので、固定スプレッドでテストを行ったところ、全く同じでした

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

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

また、コードに何か改善すべき点があれば教えてください。


あなたのコードが今どうなっているかを示せば

新しいエラーハンドリングも見てみたいので、コメントRaptorUKhttps://www.mql5.com/en/forum/148529 を参照してください。

 
deVries:


あなたはあなたのコードが今になっているものを示す場合

新しいエラーハンドリングも見てみたい方は、コメント RaptorUKhttps://www.mql5.com/en/forum/148529 を参照してください。

よし、これで行こう。

#property copyright "me"
#property link      "killnosock.net"
extern int SlowEma = 21;
extern int FastEma = 10;
extern int MaxRisk = 100;// % of Depo to be traded per order
extern int  TakeProfit=0;
extern int  StopLoss=0;
extern int TrailingStop=0;
extern int Slippage = 10;

extern double MinDiff = 0.002;

int LastBars = 0;
//0 - undefined, 1 - bullish cross (fast MA above slow MA), -1 - bearish cross (fast MA below slow MA)
int PrevCross = 0;

int init(){return(0);}
int deinit() {return(0);}

価格の正規化。

double NormPrice(double g_price)
{
   return (NormalizeDouble(g_price,MarketInfo(Symbol(),MODE_DIGITS)));
}

GetLot関数、私はそれが変更されていないと思います。

//function GetLot, get size of the lot according to MaxRisk
double GetLot(int Risk)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) {
 Alert(" free= ", AccountFreeMargin()," for one lot= ", MarketInfo(Symbol(),MODE_MARGINREQUIRED)," lot= ", Lot);
 return(0.0);}
return(Lot);}

新しい注文機能で、正規化された価格を使用するようになりました。

//function NewOrder, place new order
int NewOrder(int Cmd,double Lot)
{double TP=0; //тейкпрофит
 double SL=0; //стоплосс
 double PR=0; //Цена
 color clr = CLR_NONE;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=NormPrice(Ask + Ask*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(Ask - Ask*StopLoss/100);
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Green;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=NormPrice(Bid - Bid*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(Bid + Bid*StopLoss/100);
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr=Red;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",0,0,clr);
 if(tic<0)
  {
   Print("open order error:",GetLastError());
   Print("cmd ", Cmd, " Lot ", Lot, " PR ", PR, " Slip ", Slippage, " SL ", SL, " TP ", TP, " Ask ", Ask, " Bid ", Bid);
  }
return(tic);}

1またはすべての注文を閉じる

私は1つのシンボルだけで、1つのアカウントに1つのEAで取引するつもりなので、シンボルとマジックナンバーをチェックするために注文のクローズ機能を変更していません。しかし、他の重要な問題やチューニングに対処した後に行うつもりです。

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      CloseOrder();
     }
return;}

EMAのクロス検出をEmaDiff[2]とEmaDiff[1]の比較からEmaDiff[0]とゼロの比較に変更し、追加フラグを使用しました(すべて私が見つけたいくつかの例から来るものです)。

分スケールのデモ口座では、スプレッドが買い取引はEMAが交差させ、その後、同じ分バー内でその後に来る売り取引は、再びそれらを分離させるように高いときに偽のトリガーを作る。

[url=http://postimg.org/image/udq4ufmqf/][img]http://s15.postimg.org/udq4ufmqf/mess.jpg[/img][/url]

今、この対処法を考えているところです

// check cross
void CheckCross()
{
   double FMA_Current = iMA(Symbol(),0,FastEma,0,MODE_EMA,PRICE_CLOSE,0);
   double SMA_Current = iMA(Symbol(),0,SlowEma,0,MODE_EMA,PRICE_CLOSE,0);
   double Poin = (FMA_Current + SMA_Current)/2;
   double Lot;
   if (PrevCross == 0) //Was undefined
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) PrevCross = 1; //Bullish state
      else if ((SMA_Current - FMA_Current) >= MinDiff * Poin) PrevCross = -1; //Bearish state
      return;
   }
   else if (PrevCross == 1) //Was bullish
   {
      if ((SMA_Current - FMA_Current) >= MinDiff * Poin) //Became bearish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder(OP_SELL,Lot);
         PrevCross = -1;
      }
   }
   else if (PrevCross == -1) //Was bearish
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) //Became bullish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder(OP_BUY,Lot);
         PrevCross = 1;
      }
   }
}

トレーリングストップ機能の

// trailing stop
void DoTrailing()
{
   int total = OrdersTotal();
   for (int pos = 0; pos < total; pos++)
   {
      if (OrderSelect(pos, SELECT_BY_POS) == false) continue;
      if (OrderSymbol() == Symbol())
      {
         if (OrderType() == OP_BUY)
         {
            RefreshRates();
            if (Bid - OrderOpenPrice() >= TrailingStop * Bid/100) //If profit is greater or equal to the desired Trailing Stop value
            {
               if (OrderStopLoss() < (Bid - TrailingStop * Bid/100)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Bid - TrailingStop * Bid/100), OrderTakeProfit(), 0);
            }
         }
         else if (OrderType() == OP_SELL)
         {
            RefreshRates();
            if (OrderOpenPrice() - Ask >= TrailingStop * Ask/100) //If profit is greater or equal to the desired Trailing Stop value
            {
                      if ((OrderStopLoss() > (Ask + TrailingStop * Ask/100)) || (OrderStopLoss() == 0)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Ask + TrailingStop * Ask/100), OrderTakeProfit(), 0);
            }
         }
      }
   }   
}

と本体そのものです。

//main program
int start()
  {

   if (TrailingStop > 0) DoTrailing();
          
        static datetime Time0;
        if (Time0 == Time[0]) return;
        Time0 = Time[0];
      {
       CheckCross();     
              
      }

   return(0);
  }

ご関心をお寄せいただきありがとうございます



 
prupru:


シンボルやマジックナンバーをチェックするオーダークローズ機能は、1シンボルだけで、1口座に1EAで取引しようと思っているので、変更していません。しかし、他の重要な問題やチューニングを処理した後、それを行う予定です。


怠けてないで、直接やってください。

それはあなたが常に含める必要がある重要な ことです。

もし、あなたがプログラムを修正したいのなら、私たちは何が必要かをアドバイスします。

もし、あなたがそれを修正するために働くことを望まないなら、私たちはあなたを助けるために何をしているのですか?

 
deVries:


怠けるな、直接やれ !

これは、あなたが常に含める必要がある重要なことです。

もし、あなたがプログラムを修正したいのなら、私たちは何が必要かをアドバイスします。

もし、あなたがそれを修正するために働きたくないとしたら、私たちはあなたを助けるために何をしているのでしょうか?


OK, OK, just take it easy)

これで大丈夫だと思います。

オープンオーダー機能

OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",Expert_ID,0,clr);

すべての注文を閉じる

//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Expert_ID))  CloseOrder();
     }
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
     }
   }
return;}
 

今、もっと大きな問題があります。私のブローカーは、注文を部分的に実行する傾向があります。

親愛なるお客様へ

お客様の取引は価格587.318で部分的に(15.84のうち2.32ロット)開始されたことをここにお知らせします。

この問題について何かご質問がありましたら、ご遠慮なくお問い合わせください。

よろしくお願いします。

ブローカー

以下は、サポートのコメントです。

ボラティリティが高い時や流動性が低い時、指値注文が部分的に執行されることがありますので、ご了承ください。これは、価格が合致した場合、ポジションが即座に全額または一部で満たされることを意味します。お客様の場合、注文は部分的に執行されたので、通知書が届いたのです。

注文が部分的に成立しているにもかかわらず、すべての注文を決済する方法はわかりました。

edit:

シンボル注文とマジックナンバー注文をちゃんとチェックしないといけないことに今気づきました。

edit: 部分的に閉じていても注文を閉じるようにするclose all orders関数は こちらです。

//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

for(int j=OrdersTotal()-1;j>=0;j--)
{
    if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
      {
       if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Expert_ID)) notMyOrders++;
      }
    else
      {
       Print("Error selecting order: ",GetLastError());
       Print(" j= ", j, " Symbol= ", OrderSymbol());
      }    
}

 while (OrdersTotal()>notMyOrders)
 {
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Expert_ID))  CloseOrder();
     }
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
     }
   }
 }


return;}
 

ここでは、オープンオーダーの部分実行について、どのように格闘していくかを説明します。

新規注文はNewOrder関数で 実行されなくなり、この関数で実行されることになります。

//OpenOrders in case of partial execution
int OpenPartOrders(int Cmd, double Lot)
{
 int NumOrders = 0;
 int LastTic = -1;
 double Step = MarketInfo(Symbol(),MODE_LOTSTEP);
 double LotRemains = Lot;
 
 //MathFloor( /Step)*Step;;
while (LotRemains>0)
 {
  LastTic = NewOrder(Cmd, LotRemains);
  NumOrders++;
  if(OrderSelect(LastTic, SELECT_BY_TICKET)==true)
     {
      LotRemains = LotRemains - OrderLots();
      Print("NumberOfOrders ", NumOrders, " Ticket ", LastTic, " LotRemains ", LotRemains, " initial Lot ", Lot);          
     }
  else
   {
    Print("OrderSelect returned the error of ",GetLastError());
    LotRemains = 0;//not to create an endless loop opening new orders again and again
   }
 } 
return(NumOrders);}