MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 60

 
Sergey Gritsay:
注文の締めブロックに不具合がありましたので、修正しました。
ありがとうございます。
 

なぜ注文が開けないのか、教えてください。エラー 130 が表示されます。

input double RSIperiod=14;
input double Urov_70=70;
input double Urov_30=30;
input double Lot=0.01;
input int    TakeProfit=100;
input int    StopLoss=100;
input int    MagicNumber=523;
input int    slippage=30;

double tp=0,sl=0,OrderBuy=0,OrderSell=0;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   tp=NormalizeDouble(TakeProfit*_Point,_Digits);
   sl=NormalizeDouble(StopLoss*_Point,_Digits);
  return(INIT_SUCCEEDED);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber)
           {
            if(OrderType()==OP_BUY){}
            if(OrderType()==OP_SELL){}
           }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+
   if(OrderBuy<1 && rsi>Urov_70 && rsi1<Urov_70)
     {
     tiket= OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,sl,tp,NULL,MagicNumber,0,clrBlue);
     }
   if(OrderSell<1 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,sl,tp,NULL,MagicNumber,0,clrRed);
     }
  }
//+------------------------------------------------------------------+

 

私はプロではないので、間違っているかもしれません。

ここんとこ

tp=NormalizeDouble(TakeProfit*_Point,_Digits)。

sl=NormalizeDouble(StopLoss*_Point,_Digits)

こんな感じで行くと、より理解しやすいと思います。

tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits)。

sl=NormalizeDouble(Bid-StopLoss*_Point,_Digits)

また、グローバル変数 tpとslをゼロにする必要はありません。

 
Ibragim Dzhanaev:

なぜ注文が開けないのか、教えてください。130エラー です。

...

エラー130は、クローズドストップです。最小停止距離のチェック - StopLevel

そして、そう、すでに上で述べたように、あなたは間違った計算をしているのです。

 

そうしたら、何も変わらなかった(

はい、発表したばかりです。

input double RSIperiod=14;
input double Urov_70=70;
input double Urov_30=30;
input double Lot=0.01;
input int    TakeProfit=100;
input int    StopLoss=100;
input int    MagicNumber=523;
input int    slippage=30;

double tp=0,sl=0,OrderBuy=0,OrderSell=0;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   sl=NormalizeDouble(Bid-StopLoss*_Point,_Digits);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber)
           {
            if(OrderType()==OP_BUY){}
            if(OrderType()==OP_SELL){}
           }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0;
   if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0;
///---
  
   if(OrderBuy<1 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,sl,tp,NULL,MagicNumber,0,clrBlue);
     }
   if(OrderSell<1 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,sl,tp,NULL,MagicNumber,0,clrRed);
     }
  }
//+------------------------------------------------------------------+
 
Ibragim Dzhanaev:

そうしたら、何も変わらなかった(

input double RSIperiod=14;
input double Urov_70=70;
input double Urov_30=30;
input double Lot=0.01;
input int    TakeProfit=100;
input int    StopLoss=100;
input int    MagicNumber=523;
input int    slippage=30;

double tp=0,sl=0,OrderBuy=0,OrderSell=0;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   sl=NormalizeDouble(Bid-StopLoss*_Point,_Digits);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber)
           {
            if(OrderType()==OP_BUY){}
            if(OrderType()==OP_SELL){}
           }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0;
   if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0;
///---
  
   if(OrderBuy<1 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,sl,tp,NULL,MagicNumber,0,clrBlue);
     }
   if(OrderSell<1 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,sl,tp,NULL,MagicNumber,0,clrRed);
     }
  }
//+------------------------------------------------------------------+


ストップの計算をオンティックに移動させる

   tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   sl=NormalizeDouble(Bid-StopLoss*_Point,_Digits);


..

 

tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
sl=NormalizeDouble(Bid-StopLoss*_Point,_Digits);

OP_BUYのバリアントです。

OP_SELL用

tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits) となります。

sl=NormalizeDouble(Ask+StopLoss*_Point,_Digits)
 

エラー148クリック するごとに開きます。

input double RSIperiod=14;
input double Urov_70=70;
input double Urov_30=30;
input double Lot=0.01;
input int    TakeProfit=100;
input int    StopLoss=100;
input int    MagicNumber=523;
input int    slippage=30;

double tp,sl,OrderBuy=0,OrderSell=0;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber)
           {
            if(OrderType()==OP_BUY){}
            if(OrderType()==OP_SELL){}
           }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0;
   if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0;

   tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   sl=NormalizeDouble(Bid-StopLoss*_Point,_Digits);

   tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
   sl=NormalizeDouble(Ask+StopLoss*_Point,_Digits);

///---

   if(OrderBuy<1 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,sl,tp,NULL,MagicNumber,0,clrBlue);
     }
   if(OrderSell<1 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,sl,tp,NULL,MagicNumber,0,clrRed);
     }
  }
//+------------------------------------------------------------------+
 

2つの異なる値のsl tp

slSell , slBuy, tpSell, tpBuy のように呼び方を変える。

 
RichLux:

2つの異なる値のsl tp

slSell , slBuy, tpSell, tpBuy のように呼び方を変える。

役に立たなかった(

double tp,sl,OrderBuy=0,OrderSell=0;
double slSell,slBuy,tpSell,tpBuy;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber)
           {
            if(OrderType()==OP_BUY){}
            if(OrderType()==OP_SELL){}
           }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0;
   if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0;

   tpBuy=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   slBuy=NormalizeDouble(Bid-StopLoss*_Point,_Digits);

   tpSell=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
   slSell=NormalizeDouble(Ask+StopLoss*_Point,_Digits);
///---
   if(OrderBuy<1 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,sl,tp,NULL,MagicNumber,0,clrBlue);      
     }      
   if(OrderSell<1 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,sl,tp,NULL,MagicNumber,0,clrRed);      
     }
  }
//+------------------------------------------------------------------+