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

 
Zalevsky1234:

こんにちは。

EAのパラメータにコメントや説明の列を追加することは可能かどうか教えてください。???

ありがとうございます。

ええ、でもソースが必要です。
 
MakarFX:
はい、でも、ソースが必要です。
大したことないんだけど...。

   input int i = 5;            
   input bool b = false;    
 
void OnTick()
  {
  if(i != 0) 
         {
            Comment("123");
         }
  }
 
Mihail Matkovskij:

ありがとうございました。MQLにそんな機能があったとは。自分でも作ろうと思っていたところでした。でもその前に、フォーラムで聞いて みようと思いました。

これは、言語学習に対する間違ったアプローチの結果である。リソースヘルプを読んでg.code from......ではなく、ドキュメントで作業していれば、そのことが分かったはずです。と聞かれることもないでしょう。
 
Zalevsky1234:

こんにちは。

EAのパラメータにコメントや説明の列を追加することは可能かどうか教えてください。???

ありがとうございます。

いつになったらドキュメントを 読めるようになるんだ?

//--- input parameters
input int            InpMAPeriod=13;         // Smoothing period
input int            InpMAShift=0;           // Line horizontal shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA;  // Smoothing method


Input переменные - Переменные - Основы языка - Справочник MQL4
Input переменные - Переменные - Основы языка - Справочник MQL4
  • docs.mql4.com
Input переменные - Переменные - Основы языка - Справочник MQL4
 
私は、トレーリングを行う際Take Profit500、Stop Loss が150に なるようにしました。
最大5契約まで追加購入。
すでに2つのポジションが開いているときに、新しいポジションの開設を禁止することはできますか?オープンポジションの数量を制限する。



//--------------------------------------------------------------------

void OPENORDER(string ord)

  {
  
  double priceL=m_symbol.Ask();
   if(ord=="Sell")      
        //--- check for free money
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
      if(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,""))
         Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of Retcode: ",m_trade.ResultRetcodeDescription(),
               ", ticket of order: ",m_trade.ResultOrder());                     // Если sell, то не открываемся
     double priceS=m_symbol.Bid();
   if(ord=="Buy")
         //--- check for free money
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
      if(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,""))
 
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription(),
               ", ticket of deal: ",m_trade.ResultDeal());
   return;
 }
  double iMAGet(const int handle,const int index)
  {
   double MA[];
   ArraySetAsSeries(MA,true);
//--- reset error code
   ResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index
   if(CopyBuffer(handle,0,0,index+1,MA)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(0.0);
     }
   return(MA[index]);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Get Time for specified bar index                                 |
//+------------------------------------------------------------------+
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[];
   datetime time=0;
   ArraySetAsSeries(Time,true);
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
 
 
}
void TrailingOrder()
  {

   if(InpTrailingOrderLimit==0)
      return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                     
                        m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Buy");
                    }
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Sell");
                   }
              }
           }
    }      
 void Trailing()
  {
   if(InpTStop==0)
      return;
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                    }
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) ||
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                   }
              }
         }
   }
 
Alexey Viktorov:
これは、言語の研究に対する間違ったアプローチの結果である。リソースのヘルプを読んで......からのコーディングではなく、ドキュメントを見ながら作業していたらと聞かれることもないでしょう。

私の答えの後には、お説教が待っていると思ったので...。あのね、あなたがするような...と言ったつもりだったのですが。"ありがとうございます "でも、ない...。何か書かないと...。ドキュメントで関数を知っているならば、それは良いことです。でも、コードをちゃんと知らないと、MQLのドキュメントを上下に勉強しても、実践ではほとんど役に立ちません......!

 

偶然にもこのバグに遭遇

座標がわずかに異なる2つの同じボタンを作成する

   CreateButton(0,"lab_Button1",0,79,20,77,25,CORNER_RIGHT_UPPER," ","START","Arial Black",10,clrWhite,clrGreen,
   BORDER_SUNKEN,false,false,false,false,false,0);
   CreateButton(0,"lab_Button2",0,4,50,-73,25,CORNER_RIGHT_UPPER," ","START","Arial Black",10,clrWhite,clrGreen,
   BORDER_SUNKEN,false,false,false,false,false,0);

次のようになります。


しかし、その結果、OnChartEventに 反応するのは1つ目のボタンだけで、2つ目のボタンは反応しない。

 
Eugen8519:
トレーリングの際Take Profit500、Stop Loss が150に なるようにしました。
最大5契約まで追加購入。
すでに2つのポジションが開いているときに、新しいポジションの開設を禁止することはできますか?オープンポジションの数量を制限する。

MQL5を知らないのですが、確か

void TrailingOrder()
  {

   if(InpTrailingOrderLimit==0||PositionsTotal()>=2)
      return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                     
                        m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Buy");
                    }
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Sell");
                   }
              }
           }
    }      
 
MakarFX:

偶然にもこのバグに遭遇

座標がわずかに異なる、2つの同じボタンを作成する

次のようになります。


が、結果的にOnChartEventに 反応するのは1つ目のボタンのみで、2つ目は反応しない。

ハンドラ内のコードを見ることができますか?

また、なぜパラメータに-73があるのか、いまいちよくわからないのですが......?

 
Mihail Matkovskij:

ハンドラ内のコードを見ることはできますか?

また、パラメータに-73があるのはなぜでしょうか、よく分かりませんが...?

エラーも出ない。

この座標では、ボタンの長さは点Xから+/-で計算されるため、ボタンは上下逆さまになります。