初学者的问题 MQL5 MT5 MetaTrader 5 - 页 74

 
你好!我试图创建一个 使用2个符号的指标(例如欧元兑美元和英镑兑美元),它没有绘制(给出一个错误4806)......我在每个符号的OnInit函数(例如iRSI)中获得指标句柄,我将指标数据复制到缓冲区并对其进行进一步操作......它接收一个符号的指标数据(与图表上的符号重合的符号,我将指标附在上面)是可以的,但第二个符号的指标数据没有收到......也就是说,它只接收与图表上的符号重合的符号的数据,它被附在上面......我哪里做错了?
 
FinEngineer:
你好!我试图创建一个 使用2个符号的指标(例如欧元兑美元和英镑兑美元),它没有绘制(给出一个错误4806)...我在每个符号的OnInit函数(例如iRSI)中获得指标句柄,我将指标数据复制到缓冲区并对其进行进一步操作...它接收一个符号的指标数据(与图表上的符号一致,我将指标附加在上面)是可以的,但第二个符号的指标数据没有收到......也就是说,它只收到与图表上的符号一致的数据,指标被附加在上面......我做错了什么呢?
因此,请告诉我导致问题的那部分代码。
 

我把整个代码贴出来,因为没有任何作用,在mql4上一切都很容易,也许我只是不习惯......这些句柄和辅助缓冲区让我的大脑很痛苦。

我认为意思很清楚(2个相关符号的rsi差异),请帮助....,指出错误?

#property copyright "Copyright 2012, MetaQuotes Software Corp.
#属性链接 "http://www.mql5.com"
#财产版本 "1.00"

//---- 指示器的渲染属性
#property indicator_buffers 3
#property indicator_label1 "Pair_delta_RSI"
#属性 indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#属性输入参数
输入字符串 Symbol1_Name = "EURUSD"。
输入字符串 Symbol2_Name = "GBPUSD"。
输入 int PeriodRSI=7;
输入 bool Inversia=false。
输入ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE。

doubleRSI_Buffer[]。
双倍RSI1_Buffer[]。
双倍RSI2_Buffer[]。

int RSI1_Handle;
int RSI2_Handle;

int OnInit()
{
SetIndexBuffer(0,DeltaRSI_Buffer,INDICATOR_DATA)。
SetIndexBuffer(1,RSI1_Buffer,INDICATOR_CALCULATIONS)。
SetIndexBuffer(2,RSI2_Buffer,INDICATOR_CALCULATIONS)。

RSI1_Handle=iRSI(Symbol1_Name,0,PeriodRSI,PRICE_CLOSE);//获取指标手柄
RSI2_Handle=iRSI(Symbol2_Name,0,PeriodRSI,PRICE_CLOSE)。
return(0);
}

int OnCalculate(const int rates_total,const int prev_calculated,
const datetime &Time[]。
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volume[],
const int &Spread[])
{
int calculated=BarsCalculated(RSI1_Handle)。
if(calculated<rates_total)
{
Print("不是所有RSI1_Handle的数据都被计算出来了(",calculated, "bar)。错误",GetLastError())。
return(0);
}
calculated=BarsCalculated(RSI2_Handle)。
if(calculated<rates_total)
{
Print("不是所有RSI2_Handle的数据都被计算出来了(",calculated, "bar)。错误",GetLastError())。
return(0);
}
//------我们可以不复制所有的数据
int to_copy;
如果(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
否则
{
to_copy=rates_total-prev_calculated。
如果(prev_calculated>0)to_copy++。
}
//接收RSI1缓冲区
如果(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("获取RSI1失败!错误",GetLastError())。
return(0);
}
//获得RSI2缓冲区
如果(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("获取RSI2失败!错误",GetLastError())。
return(0);
}
//---
int限制。
如果(prev_calculated==0)
limit=0。
否则limit=prev_calculated-1。
//计算delta rsi指标
for(int i=limit;i<rates_total; i++)
DeltaRSI_Buffer[i]=RSI1_Buffer[i]-RSI2_Buffer[i]。
return(rate_total)。
}

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

错误#1

未能使用SRC键

 

例如,如果你采取一个标准的自定义MACD指标,并改变以下一行,就会出现这样的错误

ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice) 。

ExtFastMaHandle=iMA("EURUSD",0,InpFastEMA,0,MODE_EMA,InpAppliedPrice)。

如果MACD附在EURUSD图表上,一切都会被画出来,如果它附在另一个图表上--会出现错误4806......我怎样才能使它在这个指标中,我可以使用我想要的许多符号?

如果你告诉我如何使之前发布的指标发挥作用,我将非常感激。

 
mario065:

莱斯特:我在这里放了一个模板,里面有一个修改,显示如何爬行。

https://www.mql5.com/ru/forum/6343/page73

如果你不愿意,你必须正确计算变量。

我已经有了沙布隆文件的想法,但成功率不高,把它带到我的条件中去了一下,它是有效的。然而,对我来说有一个重要的僵局--它们被设置在下一根蜡烛上,而不是在一个刻度上。下面是EA的部分内容。

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  
  if(PositionSelect(_Symbol))
  {
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits()); 
    
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }
 
Lester:

随着不同程度的成功,我得到了沙布隆文件的要点,根据我的条件进行了一些调整,万岁--止损和利润已经设定。然而,对我来说有一个重要的僵局--它们被设置在下一根蜡烛上,而不是在一个刻度上。这里是代码的一部分。

input double TP            = 0.003;
input double STR           = 0.0012;
input double TR            = 0.0002;
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
Ну ладно-обяснения:

  if(PositionSelect(_Symbol)){//Ест ли позиция по символа
     Open = PositionGetDouble(POSITION_PRICE_OPEN);//цена опен для поза
     SL   = PositionGetDouble(POSITION_SL);//цена стоп для поза
     T_P  = PositionGetDouble(POSITION_TP);//цена тейк для поза
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);//цена бид
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);//цена аск
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);//стоп ниво,если ест такое-оно в пункты
     buy_trail = NormalizeDouble(Bid - Open,Digits());//вычисляем разстояние от цена бид и цена опен позиции-ето для бай
     sel_trail = NormalizeDouble(Open - Ask,Digits());//вычисляем разстояние от цена опен позиции и цена аск-ето для сел
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)//если ест бай поза
      {
      if(buy_trail > STR)//если разстояние болше указаное
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
//если цена бид минус указаное разстояние болше щем цена опен и цена опен болше цена стоп-вызиваем модификация
//сама модификация-для стоп будет цена опен,цена тейк не меняем.
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
//если цена бид минус указаное разстояние TR = 0.0002 болше уже от новый стоп(который поменяли уже) и цена опен менше новый стоп 
//вызиваем модификация
//сама модификация - для стоп будет прошлый стоп минус стоп ниво* _Point(что б стали пипси) плюс указаное TR,цена тейк не меняем.
//Т.е. будем двигат стоп через каждые 2 пипса  
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//===============================================

代码应该总是包含一些行动的条件,但所有的东西都应该被检查并有一些逻辑。

如果你想帮忙,请打印(" ", ); ),看看结果。

 
mario065:

这些描述都很清楚,而且都很有效。但这是对 "收支平衡 "和 "尾随 "的修改。我应该写一个修改,在开单后设置StopLimit和TakeProfit,也就是说。

1.订货会开幕

--------

2.修改停止限制(这个还没到!)。

 if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }

------

3.盈亏平衡的修改

4.修改拖曳式止损

5.关闭订单


你可以使用第2点来修改订单,但只能在下一栏的开始。

 

写了一个函数来打开eats。

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
bool BuyPositionOpen(const string symbol,double volume,ulong deviation,double StopLoss,double Takeprofit,int Magic)     
    if(Какое то условие)
      {
       BuyPositionOpen(_Symbol,Lot,0,NormalizeDouble(Ask - 0.003,_Digits),NormalizeDouble(Ask + 0.003,_Digits),MagicNumber);
      }
     if(Какое то условие)
      {
       SellPositionOpen(_Symbol,Lot,0,NormalizeDouble(Bid + 0.003,_Digits),NormalizeDouble(Bid - 0.003,_Digits),MagicNumber);
      }
Функция для закрития:
Сама функция(символ,проскалзивание,магик)
bool BuyPositionClose(const string symbol,ulong deviation,int Magic)
// Логика за затваряне на дългите
      if(Какое то условие){
         BuyPositionClose(_Symbol,0,MagicNumber);}                        
// Логика за затваряне на късите
      if(Какое то условие){
         SellPositionClose(_Symbol,0,MagicNumber);} 

Если не хочете сразу ставит стоп и тейк,тогда:
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  if(PositionSelect(_Symbol)){
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits());
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
if(SL = 0 && T_P = 0)//если стоп и тейк равни нулю-вызиваете модофикация и там акуратно ложите нужная вам цена
{
  ModifyPosition(_Symbol,NormalizeDouble((Open - 0.003),Digits()),NormalizeDouble((Open + 0.003),Digits()));
}
//Далше вам понятно:
      if(buy_trail > STR)
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//=============================================== 
 
这条线上有任何MQL5的开发者吗!?我是不是在错误的分支中提出了一个问题?那么请告诉我如何向开发者提出问题?上面的问题对一个有经验的程序员来说是很基本的...