Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 74

 
Olá! tentei criar um indicador que usa 2 símbolos (EURUSD e GBPUSD por exemplo), não desenha (dá um erro 4806) ... Recebo alças indicadoras na função OnInit (iRSI por exemplo) de cada símbolo, copio os dados indicadores para buffers e realizo outras operações com eles ...Recebe dados indicadores para um símbolo (o símbolo que coincide com o símbolo no gráfico, ao qual anexei o indicador) está ok, mas os dados indicadores para o segundo símbolo não são recebidos ... Ou seja, recebe dados apenas para o símbolo que coincide com o símbolo no gráfico, ao qual está anexado ... o que estou a fazer mal?
 
FinEngineer:
Olá! tentei criar um indicador que usa 2 símbolos (EURUSD e GBPUSD por exemplo), não desenha (dá um erro 4806) ... recebo alças indicadoras na função OnInit (iRSI por exemplo) de cada símbolo, copio dados indicadores para buffers e faço outras operações com eles ...Recebe dados indicadores para um símbolo (o mesmo símbolo que coincide com o símbolo no gráfico, ao qual anexei o indicador) está ok, mas os dados indicadores para o segundo símbolo não são recebidos ... ou seja, recebe dados apenas para o símbolo que coincide com o símbolo no gráfico, ao qual o indicador está anexado ... o que estou a fazer mal?
Mostre-me então a parte do código que causou o problema.
 

Estou a afixar o código inteiro, porque nada funciona, no mql4 tudo era muito mais fácil, talvez seja porque não estou habituado... estas pegas e amortecedores auxiliares estão a matar o meu cérebro.

Penso que o significado é claro (diferença em rsi de 2 símbolos correlatos), por favor ajude.... a apontar os erros?

#property copyright "Copyright 2012, MetaQuotes Software Corp.
#ligação de propriedade "http://www.mql5.com"
#propriedade versão "1.00"

//---- indicator rendering properties
#nóculos_indicadores de propriedade 3
#indicador de propriedade_label1 "Pair_delta_RSI"
#property indicator_type1 DRAW_LINE
#indicador de propriedade_color1 Vermelho
#property indicator_style1 STYLE_SOLID
#largura_do_indicador de propriedade1 1
#parâmetros de entrada de propriedade
cadeia de entrada Symbol1_Name = "EURUSD";
cadeia de entrada Symbol2_Name = "GBPUSD";
input int PeriodRSI=7;
input bool Inversia=false;
input ENUM_APPLIED_PRICE inputAppliedPrice=PREÇO_CLOSE;

doubleRSI_Buffer[];
duplo RSI1_Buffer[];
duplo RSI2_Buffer[];

int RSI1_Handle;
int RSI2_Handle;

int OnInit()
{
SetIndexBuffer(0,DeltaRSI_Buffer,INDICADOR_DATA);
SetIndexBuffer(1,RSI1_Buffer,INDICADOR_CALCULATIONS);
SetIndexBuffer(2,RSI2_Buffer,INDICADOR_CALCULATIONS);

RSI1_Handle=iRSI(Symbol1_Name,0,PeriodRSI,PRICE_CLOSE);//Get indicator handles
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 calculado=BarsCalculado(RSI1_Handle);
if(calculated<rates_total)
{
Imprimir("Nem todos os dados do RSI1_Handle são calculados (",calculado, "barras). Erro",GetLastError()));
return(0);
}
calculado=BarsCalculated(RSI2_Handle);
if(calculated<rates_total)
{
Imprimir("Nem todos os dados do RSI2_Handle são calculados (",calculado, "barras"). Erro",GetLastError();
return(0);
}
//--- não podemos copiar todos os dados
int to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
senão
{
to_copy=rates_total-prev_calculado;
if(prev_calculated>0) to_copy++;
}
//receber o tampão RSI1
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Imprimir("Obter o RSI1 falhou! Erro",GetLastError()));
return(0);
}
//Get RSI2 buffer
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Imprimir("Obter o RSI2 falhou! Erro",GetLastError()));
return(0);
}
//---
int limit;
if(prev_calculated==0)
limite=0;
senão limit=prev_calculated-1;
//calcule o indicador delta rsi
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
 

erro #1

falha na utilização da chave SRC

 

Tal erro ocorre, por exemplo, se pegar num indicador MACD padrão personalizado e alterar a seguinte linha

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

para

ExtFastMaHandle=iMA("EURUSD",0,InpFastEMA,0,MODE_EMA,InpMAAplicadoPreço);

Se o MACD estiver anexado ao gráfico EURUSD, tudo será desenhado, se estiver anexado a outro gráfico - o erro 4806 aparecerá... Como posso fazer para que neste indicador eu possa usar quantos símbolos eu quiser?

Se souber como fazer funcionar o indicador previamente afixado, ficar-lhe-ei muito grato.

 
mario065:

Lester: Aqui coloco um modelo, no interior há uma modificação que mostra como rastejar.

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

Se não o desejar, tem de contar correctamente as variáveis.

Tive a ideia do ficheiro Schablon com sucesso misto, trouxe-o um pouco às minhas condições e funciona. No entanto, existe um impasse significativo para mim - eles estão colocados na vela seguinte, não num carrapato. Aqui está a parte da 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:

Com sucesso variável obtive a essência do ficheiro Schablon, ajustei-o um pouco às minhas condições e Hurra - paragens e lucros são estabelecidos. No entanto, existe um impasse significativo para mim - eles estão colocados na vela seguinte, não num carrapato. Aqui está uma parte do código.

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

O código deve sempre conter condições para algumas acções, mas tudo deve ser verificado e ter alguma lógica.

Se quiser ajudar, imprima(" ", ); ) e veja o resultado.

 
mario065:

As descrições são todas claras e funcionam. Mas isto é uma modificação para "breakeven" e "trailing". Devo escrever uma modificação para definir StopLimit e TakeProfit após a abertura da encomenda, ou seja

1. abertura do pedido

--------

2. Modificação para parar o limite (este ainda não está lá!)

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

------

3. modificação para o Breakeven

4.Modificação para a paragem de reboque

5.Fechar encomenda


Pode utilizar o ponto 2 para modificar a ordem, mas apenas no início do bar seguinte.

 

Uma função é escrita para abrir e comer:

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
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);
           }
        }
      }
     } 
//=============================================== 
 
Há algum programador MQL5 nesta linha!? Estou a fazer uma pergunta no ramo errado? Então diga-me como fazer uma pergunta aos criadores? A questão acima é elementar para um programador experiente...
Razão: