Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 74

 
Здравствуйте! Пытался создать индикатор в котором используются 2 символа(EURUSD И GBPUSD например), он не рисует(выдает ошибку 4806)...в функции OnInit получаю хэндлы индикаторов(iRSI например) каждого символа, В функции OnCalculate копирую данные индикаторов в буферы и провожу с ними дальнейшие операции...так вот данные индикатора по одному символу(по тому символу, который совпадает с символом на графике, к которому цепляю индикатор) он получает нормально, а данные индикатора по второму символу не получает...т.е. он получает данные только по тому символу, который совпадает с символом на графике, к которому прикреплен индикаторо...что я делаю не так?
 
FinEngineer:
Здравствуйте! Пытался создать индикатор в котором используются 2 символа(EURUSD И GBPUSD например), он не рисует(выдает ошибку 4806)...в функции OnInit получаю хэндлы индикаторов(iRSI например) каждого символа, В функции OnCalculate копирую данные индикаторов в буферы и провожу с ними дальнейшие операции...так вот данные индикатора по одному символу(по тому символу, который совпадает с символом на графике, к которому цепляю индикатор) он получает нормально, а данные индикатора по второму символу не получает...т.е. он получает данные только по тому символу, который совпадает с символом на графике, к которому прикреплен индикаторо...что я делаю не так?
 Так покажите часть кода, вызвавшую проблему.
 

Выкладываю весь код, потому что ничего не работает, на mql4 все было проще гораздо, может просто от непривычки...эти хэндлы и вспомогательные буферы выносят мозг.

Смысл думаю понятен(разница по rsi 2х коррелирующих инструментов), помогите плиз...укажите на ошибки?

 

#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

//---- свойства отрисовки индикатора
#property indicator_buffers 3
#property indicator_label1  "Pair_delta_RSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//вводимые параметры
input string Symbol1_Name   = "EURUSD";     
input string Symbol2_Name   = "GBPUSD"; 
input int    PeriodRSI=7;
input bool   Inversia=false;
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;

double         DeltaRSI_Buffer[];
double         RSI1_Buffer[];
double         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("Not all data of RSI1_Handle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(RSI2_Handle);
   if(calculated<rates_total)
     {
      Print("Not all data of RSI2_Handle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   //--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//получаем буффер RSI1
   if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
     {
      Print("Getting RSI1 is failed! Error",GetLastError());
      return(0);
     }
//получаем буффер RSI2
   if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
     {
      Print("Getting RSI2 is failed! Error",GetLastError());
      return(0);
     }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//считаем индикатор дельта рси
   for(int i=limit;i<rates_total; i++)
      DeltaRSI_Buffer[i]=RSI1_Buffer[i]-RSI2_Buffer[i];
   return(rates_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:

Lester:Здес поставил шаблон,внутри ест и модификация-показал как ползуватся. 

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

Если не хотите,то надо правилно считат переменние.

С переменным успехом уловил суть файла Schablon, немного привел к моим условиям и УРА - стопы и профиты выставляется. Однако есть существенный тупик для меня - они выставляются на следующей свече, а не на тике. Привожу часть советника.

  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:

С переменным успехом уловил суть файла Schablon, немного привел к моим условиям и УРА - стопы и профиты выставляется. Однако есть существенный тупик для меня - они выставляются на следующей свеча, а не на тике. Привожу часть кода.

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);
           }
        }
      }
     } 
//===============================================

Всегда надо писат такие условия,при которые шли какие то действия,но все обдумано и чтоб было логики.

Для помощи пишите принт(Print(" ", );  ) и смотрите что вам возвращает -резултат какой от то,что написали.

 
mario065:

Все описания  понятны и они работают. Но это модификация в "безубыточность" и "трейлинг". А мне необходимо написать модификацию на установку Стоплимит и Тейкпрофит после открытия ордера, то есть

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 модификация проходит, но с началом следующего бара, а необходимо её привязать к тику, следующему после открытия ордера

 

Для открития ест написана функция:

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
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!??? Может я задаю вопрос не в той ветке? Подскажите тогда как задать вопрос разработчикам??? Вопрос изложен выше, он элементарный для опытного программиста...
Причина обращения: