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

 
Порт-моне тв: なぜか自分のはうまくいかないし、前にも試したことがあるのに思い出せませんとにかく、皆さんありがとうございました。良いトレードを!

トレードを開始するコードを投稿してください。

 
MakarFX:

ノー

パラメータ 0 はこのグラフに属していることを示す

すみません、機能と混同していました

StringFind
 
MakarFX:

トレードを開始するコードを投稿してください。

//+------------------------------------------------------------------+
//|                                         равноудаленный канал.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property strict

extern int Magic = 777701;
extern double Lot = 0.01;
extern int Slippage = 3;

 double pXa, pXb;
 int ticket;
 int OrderOfSymbol;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
//---
   //Проверим что есть ли равноудаленный канал:
   if(ObjectsTotal(OBJ_RECTANGLE)==0)
   {Comment("Нарисуйте равноудаленный канал для открытия сделки по покупке!");}

  
   //Получим ИМЯ прямоугольника:
   for(int n=0;n<ObjectsTotal();n++)
     {
     
      string name=ObjectName(n);
       if(ObjectType(name)==OBJ_RECTANGLE)
       
        {
        
       if(ObjectFind(0,"BUY")==0)
          {
          
         datetime t1a = (datetime) ObjectGet(name,OBJPROP_TIME1);
         datetime t2a = (datetime) ObjectGet(name,OBJPROP_TIME2);

         double p1a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);
         double p2a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);
 
         
     
      
 
         
    
         
         OrderOfSymbol=CounterOrderTradeType(-1); 
           if (OrderOfSymbol<1)
          if (Close[1]>Open[1])    
         if(TimeCurrent()>t1a && TimeCurrent()< t2a &&
            Bid < p1a  && Bid > p2a   )    
        {
         ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, Slippage, 0, 0, "открыт ордер на покупку", Magic, 0, Blue);
        } 
       
           }
         
         
           }
           
           
           
        
           
           
           
     }
     
      //Проверим что есть ли уже равноудаленный канал и он в единственном экземпляре:
   if(ObjectsTotal(OBJ_RECTANGLE)==1)
   {Comment("Нарисуйте второй равноудаленный канал для закрытия сделки по покупке!");}

    //Получим ИМЯ прямоугольника:
   for(int n=0;n<ObjectsTotal();n++)
     {
      string name=ObjectName(n);
   
       if(ObjectType(name)==OBJ_RECTANGLE)
       
        {
          
          
     if(ObjectFind(0,"CLOSE")==0)
          
          {
         datetime t1b = (datetime) ObjectGet(name,OBJPROP_TIME1);
         datetime t2b = (datetime) ObjectGet(name,OBJPROP_TIME2);

         double p1b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);
         double p2b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);

         
      
         
   
     
     
         if(TimeCurrent()>t1b && TimeCurrent()< t2b &&
            Bid < p1b  && Bid > p2b   )   
         CloseBuyPositions1(); 
         
     
         }
         
         
         }
     }
     
   
        //Проверим что есть ли уже 2 равноудаленных канала:
   if(ObjectsTotal(OBJ_CHANNEL)==2)
   {Comment("Каналы по открытию и закрытию ордеров по покупке выставлены - идет торговля!");}

    
    
     
     
 
  }
//+------------------------------------------------------------------+
void CloseBuyPositions1()
      {
      
       for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber() == Magic)
            if(OrderSymbol() == Symbol())
              {


          
          if(OrderType()==OP_BUY)
             {
              if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL)){Print("Order Close");}
             }
          }
       } 
//+------------------------------------------------------------------+
//| Подсчет ордеров потекущему символу                               |
//+------------------------------------------------------------------+
int CounterOrderTradeType(ENUM_ORDER_TYPE order_type)
   {
   int cnt=0;
   //----
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
      {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)==false) continue;
      if(OrderSymbol()!=_Symbol) continue;
      if(order_type == OrderType() || order_type == -1) cnt++;
      }
   //----
   return(cnt);
   }   

以下は、あなたの関数を貼り付けたものです。

 
Порт-моне тв:

以下に、あなたの機能を貼り付けます。

ファースト

OrderOfSymbol=CounterOrderTradeType(-1); 

はここに入れるべきです。

void OnTick()
  {
   OrderOfSymbol=CounterOrderTradeType(-1); 
あとは私が修正します。
 
Порт-моне тв:

以下は、あなたの関数を貼り付けたものです。

トライ

//+------------------------------------------------------------------+
//|                                         равноудаленный канал.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property strict

extern int Magic = 777701;
extern double Lot = 0.01;
extern int Slippage = 3;

 double pXa, pXb;
 int ticket;
 int OrderOfSymbol;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   OrderOfSymbol=CounterOrderTradeType(-1); 
   //Проверим что есть ли равноудаленный канал:
   if(ObjectFind(0,"BUY")!=0)
   {Comment("Нарисуйте равноудаленный канал для открытия сделки по покупке!");}

   if(ObjectFind(0,"BUY")==0)
     {
      datetime t1a = (datetime) ObjectGet("BUY",OBJPROP_TIME1);
      datetime t2a = (datetime) ObjectGet("BUY",OBJPROP_TIME2);

      double p1a=NormalizeDouble(ObjectGet("BUY",OBJPROP_PRICE1),Digits);
      double p2a=NormalizeDouble(ObjectGet("BUY",OBJPROP_PRICE2),Digits);

      if (OrderOfSymbol<1)
      if (Close[1]>Open[1])    
      if(TimeCurrent()>t1a && TimeCurrent()< t2a && Bid < p1a  && Bid > p2a   )    
        {
         ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, Slippage, 0, 0, "открыт ордер на покупку", Magic, 0, Blue);
        } 
       
      }
     
   //Проверим что есть ли уже равноудаленный канал и он в единственном экземпляре:
   if(ObjectFind(0,"CLOSE")!=0)
   {Comment("Нарисуйте второй равноудаленный канал для закрытия сделки по покупке!");}

    //Получим ИМЯ прямоугольника:
   if(ObjectFind(0,"CLOSE")==0)
     {
      datetime t1b = (datetime) ObjectGet("CLOSE",OBJPROP_TIME1);
      datetime t2b = (datetime) ObjectGet("CLOSE",OBJPROP_TIME2);

      double p1b=NormalizeDouble(ObjectGet("CLOSE",OBJPROP_PRICE1),Digits);
      double p2b=NormalizeDouble(ObjectGet("CLOSE",OBJPROP_PRICE2),Digits);
      
      if(TimeCurrent()>t1b && TimeCurrent()< t2b && Bid < p1b  && Bid > p2b   )   
         CloseBuyPositions1(); 
     }
   
        //Проверим что есть ли уже 2 равноудаленных канала:
   if(ObjectsTotal(OBJ_CHANNEL)==2)
   {Comment("Каналы по открытию и закрытию ордеров по покупке выставлены - идет торговля!");}
  }
//+------------------------------------------------------------------+
void CloseBuyPositions1()
  {
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
   if(OrderMagicNumber() == Magic)
   if(OrderSymbol() == Symbol())
     {
      if(OrderType()==OP_BUY)
        {
         if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL)){Print("Order Close");}
        }
     }
  } 
//+------------------------------------------------------------------+
//| Подсчет ордеров потекущему символу                               |
//+------------------------------------------------------------------+
int CounterOrderTradeType(ENUM_ORDER_TYPE order_type)
   {
   int cnt=0;
   //----
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
      {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)==false) continue;
      if(OrderSymbol()!=_Symbol) continue;
      if(order_type == OrderType() || order_type == -1) cnt++;
      }
   //----
   return(cnt);
   }
 
もう少し調整とアップデートを
 
MakarFX:
もう少し手を加えてアップデートしました

外出中なので、明日テストしてみます。ありがとうございます。

 
Порт-моне тв:

外出中なので、明日テストしてみます。ありがとうございます。

接触
 

皆さん、ごきげんよう。トレンドラインと水平線が ある色で交差したときにシグナルを出すEAを持っています。トレンドラインと水平線があるスタイルで交差したときにシグナルを出すように作り直すことにしました。うまくいった。しかし、トレンドラインがビームだけを右に交差させたときにシグナルを出す必要があります。を追加しなければならないことを理解しています。

objprop_ray_right

が、どこをどうしたらいいのかわからない。ありがとう ございました。
//+------------------------------------------------------------------+
//|                                          TrendlineCrossAlert.mq5 |
//|                                             Copyright 2018, Strx |
//|                               https://www.mql5.com/en/users/strx |
//+------------------------------------------------------------------+
#define    EAName      "TrendlineCrossAlert"
#define    EAVersion   "1.01"

#property copyright   "Copyright 2018, Strx"
#property link        "https://www.mql5.com/en/users/strx"
#property version     EAVersion
#property description "Horizontal and Trendlines cross detection on any pair/timeframe"
#property description "good for scalping on small timeframes (M1 to M15) and trend following on bigger ones."
#property description "It send notifications when price crosses trendlines and horizontal lines"
#property description "of specified color and when it happens, it change its color to CrossedColor input parameter"
#property description "to be sure not to send multiple notifications for same line"

#include <Arrays\ArrayString.mqh>
#include <Trade\SymbolInfo.mqh>
#include <ChartObjects\ChartObject.mqh>
#include <ChartObjects\ChartObjectsLines.mqh>

//--- External inputs
sinput ENUM_LINE_STYLE   MonitoringStyle = STYLE_SOLID;   //MonitoringColor, EA only monitors this lines style
sinput ENUM_LINE_STYLE   CrossedStyle = STYLE_DASH;       //CrossedColor, EA changes crossed lines style to this value
sinput bool    EnableAlerts = true;
sinput bool    EnableNotifications=true;
sinput bool    EnableEmails=false;

//+------------------------------------------------------------------+
//| Trendlines and Horizontal lines crossing notification expert
//+------------------------------------------------------------------+
class CTrendlineCrossAlertExpert
  {
protected:
   CSymbolInfo       m_symbol;                     // symbol info object

   //--- Logic vars
   CArrayString      m_objectNames;

public:
                     CTrendlineCrossAlertExpert(void);
                    ~CTrendlineCrossAlertExpert(void);
   bool              Init(void);

   void              Deinit(void);
   bool              Processing(void);

protected:

   //--- Inline functions 
   string              FormatPrice(double price){ return StringFormat("%."+(string)m_symbol.Digits()+"f",price); };
   bool                IsNewBar(){ return iVolume(NULL,0,0)==1; };

   //--- Logic functions
   int               FindActiveObjects();
   bool              ActiveObject(string objName);
   bool              PriceCrossed(string objName);
   void              NotifyCrossing(string objName);

  };

//--- global expert
CTrendlineCrossAlertExpert ExtExpert;

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CTrendlineCrossAlertExpert::CTrendlineCrossAlertExpert(void){}

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CTrendlineCrossAlertExpert::~CTrendlineCrossAlertExpert(void){}
//+------------------------------------------------------------------+
//| Initialization and checking for input parameters                 |
//+------------------------------------------------------------------+
bool CTrendlineCrossAlertExpert::Init(void)
  {
//--- initialize common information
   m_symbol.Name(Symbol());                  // symbol   

   return(true);
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool CTrendlineCrossAlertExpert::Processing(void)
  {
   bool rv=false;
   int i;
   string objName;

   if(m_symbol.RefreshRates())
     {
      if(FindActiveObjects())
        {
         for(i=0; i<m_objectNames.Total(); i++)
           {
            objName=m_objectNames[i];
            if(PriceCrossed(objName))
              {
               ObjectSetInteger(0,objName,OBJPROP_STYLE,CrossedStyle);
               NotifyCrossing(objName);
              }
           }
        }
     }

   Comment(EAName," v.",EAVersion," parameters: MonitoringStyle=",MonitoringStyle,", CrossedStyle=",CrossedStyle,", EnableAlerts=",EnableAlerts,", EnableNotifications=",EnableNotifications,", EnableEmails=",EnableEmails,"\n",
           "Monitoring ",m_objectNames.Total()," lines");

   return(rv);
  }
//+------------------------------------------------------------------+
//| Send Notifications function
//+------------------------------------------------------------------+
void CTrendlineCrossAlertExpert::NotifyCrossing(string objName)
  {
   string msg="Price crossed line ''"+objName+"' on "+m_symbol.Name();

   if(EnableAlerts) Alert(msg);
   if(EnableNotifications) SendNotification(msg);
   if(EnableEmails) SendMail(EAName+" Event",msg);

   Print(msg);
  }
//+------------------------------------------------------------------+
//| Returns true if objName has been crossed up or down by current price
//+------------------------------------------------------------------+
bool CTrendlineCrossAlertExpert::PriceCrossed(string objName)
  {
   ENUM_OBJECT objType;
   double objPrice=0.0,openPrice,curPrice;

   objType=(ENUM_OBJECT)ObjectGetInteger(0,objName,OBJPROP_TYPE);
   if(objType==OBJ_HLINE)
     {
      objPrice= ObjectGetDouble(0, objName, OBJPROP_PRICE);
        }else if(objType==OBJ_TREND){
      objPrice=ObjectGetValueByTime(0,objName,TimeCurrent(),0);
     }

   if(objPrice)
     {
      openPrice= iOpen(NULL,0,0);
      curPrice = iClose(NULL,0,0);

      return (openPrice<=objPrice && curPrice>objPrice) || (openPrice>=objPrice && curPrice<objPrice);
     }

   return false;
  }
//+------------------------------------------------------------------+
//| Returns true if object has to be monitored based on color and
//| previous crosses
//+------------------------------------------------------------------+
bool CTrendlineCrossAlertExpert::ActiveObject(string objName)
  {
   int objStyle=(int)ObjectGetInteger(0,objName,OBJPROP_STYLE,0);
   return objStyle == MonitoringStyle;
  }
//+------------------------------------------------------------------+
//| Returns the list of object to be monitored
//+------------------------------------------------------------------+
int CTrendlineCrossAlertExpert::FindActiveObjects()
  {
   m_objectNames.Clear();

   int nHLines=ObjectsTotal(0,-1,OBJ_HLINE),
   nTrendLines=ObjectsTotal(0,-1,OBJ_TREND),
   i;

   string objName;

   for(i=0; i<nHLines; i++)
     {
      objName=ObjectName(0,i,0,OBJ_HLINE);
      if(ActiveObject(objName))
        {
         m_objectNames.Add(objName);
        }
     }
   for(i=0; i<nTrendLines; i++)
     {
      objName=ObjectName(0,i,0,OBJ_TREND);
      if(ActiveObject(objName))
        {
         m_objectNames.Add(objName);
        }
     }

   return m_objectNames.Total();
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   if(!ExtExpert.Init())
      return(INIT_FAILED);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert new tick handling function                                |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.Processing();
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

こんにちは。
Expert Advisorは条件を確認し、新しいバーが表示されたら注文を出すことになっています。

関数 宣言はグローバル、名前空間、クラススコープでのみ許可されています」というエラーが出ました。グローバル、名前空間、クラススコープでのみ関数宣言が可能」と訳した。
やはり理解できない、私は頭が悪すぎるのだ。教えてください、またはどこで読めるか教えてください。ありがとうございました)

***

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Ошибки выполнения - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5