Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 74

 
Ho provato a creare un indicatore che utilizza 2 simboli (EURUSD e GBPUSD per esempio), non si disegna (dà un errore 4806) ... Ottengo gli handle degli indicatori nella funzione OnInit (iRSI per esempio) di ogni simbolo, copio i dati dell'indicatore nei buffer ed eseguo ulteriori operazioni con essi ...Riceve i dati dell'indicatore per un simbolo (lo stesso simbolo che coincide con il simbolo sul grafico, al quale collego l'indicatore) è ok, ma i dati dell'indicatore per il secondo simbolo non vengono ricevuti ... cioè riceve i dati solo per il simbolo che coincide con il simbolo sul grafico, al quale è collegato ... cosa sto sbagliando?
 
FinEngineer:
Ho provato a creare un indicatore che utilizza 2 simboli (EURUSD e GBPUSD per esempio), non si disegna (dà un errore 4806) ... Ottengo gli handle degli indicatori nella funzione OnInit (iRSI per esempio) di ogni simbolo, copio i dati dell'indicatore nei buffer ed eseguo ulteriori operazioni con essi ...Riceve i dati dell'indicatore per un simbolo (lo stesso simbolo che coincide con il simbolo sul grafico, al quale collego l'indicatore) è ok, ma i dati dell'indicatore per il secondo simbolo non vengono ricevuti ... cioè, riceve i dati solo per il simbolo che coincide con il simbolo sul grafico, al quale è collegato l'indicatore ... cosa sto sbagliando?
Quindi mostratemi la parte di codice che ha causato il problema.
 

Sto postando l'intero codice, perché non funziona nulla, su mql4 era tutto molto più facile, forse sono solo disabituato... questi handle e buffer ausiliari mi stanno uccidendo il cervello.

Penso che il significato sia chiaro (differenza di rsi di 2 simboli correlati), si prega di aiutare....point fuori gli errori?

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

//---- proprietà di rendering dell'indicatore
#proprietà indicator_buffers 3
#property indicator_label1 "Pair_delta_RSI"
#proprietà indicator_type1 DRAW_LINE
#property indicator_color1 Red
#proprietà indicator_style1 STYLE_SOLID
#proprietà indicator_width1 1
#parametri di input della proprietà
input stringa Symbol1_Name = "EURUSD";
input stringa Symbol2_Name = "GBPUSD";
input int PeriodRSI=7;
input bool Inversia=false;
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;

doubleRSI_Buffer[];
doppio RSI1_Buffer[];
doppio 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);//ottenere gli handle degli indicatori
RSI2_Handle=iRSI(Symbol2_Name,0,PeriodRSI,PRICE_CLOSE);
ritorno(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);
se(calcolato<tassi_totale)
{
Print("Non tutti i dati di RSI1_Handle sono calcolati (",calculated, "bars ). Error",GetLastError());
ritorno(0);
}
calculated=BarsCalculated(RSI2_Handle);
se(calcolato<tassi_totale)
{
Print("Non tutti i dati di RSI2_Handle sono calcolati (",calculated, "bars ). Errore",GetLastError();
ritorno(0);
}
//--- possiamo copiare non tutti i dati
int to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
se(prev_calcolato>0) to_copy++;
}
//ricevere il buffer RSI1
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("Ottenere RSI1 è fallito! Error",GetLastError());
ritorno(0);
}
//ottenere il buffer RSI2
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("Ottenere RSI2 è fallito! Error",GetLastError());
ritorno(0);
}
//---
limite int;
se(prev_calcolato==0)
limite=0;
else limit=prev_calculated-1;
//calcolare l'indicatore delta rsi
for(int i=limite;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
 

errore #1

mancato utilizzo del tasto SRC

 

Un tale errore si verifica, per esempio, se prendete un indicatore MACD standard personalizzato e cambiate la seguente linea

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

a

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

Se MACD è attaccato al grafico EURUSD, tutto sarà disegnato, se è attaccato a un altro grafico - apparirà l'errore 4806... Come posso fare in modo che in questo indicatore possa usare tutti i simboli che voglio?

Se sai come far funzionare l'indicatore precedentemente postato, te ne sarei molto grato.

 
mario065:

Lester: Qui ho messo un modello, dentro c'è una modifica che mostra come strisciare.

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

Se non volete, dovete contare correttamente le variabili.

Ho avuto l'idea del file Schablon con successo misto, l'ho portato un po' alle mie condizioni e funziona. Tuttavia c'è una significativa impasse per me - sono impostati sulla prossima candela, non su un tick. Ecco la parte dell'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:

Con un successo variabile ho ottenuto il succo del file Schablon, l'ho adattato un po' alle mie condizioni e Urrà - stop e profitti sono impostati. Tuttavia c'è una significativa impasse per me - sono impostati sulla prossima candela, non su un tick. Ecco una parte del codice.

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

Il codice dovrebbe sempre contenere condizioni per alcune azioni, ma tutto dovrebbe essere controllato e avere una certa logica.

Se vuoi aiutare, stampa(" ", ); ) e vedi il risultato.

 
mario065:

Le descrizioni sono tutte chiare e funzionano. Ma questa è una modifica a "breakeven" e "trailing". Dovrei scrivere una modifica per impostare StopLimit e TakeProfit dopo l'apertura dell'ordine, cioè

1. apertura dell'ordine

--------

2. Modifica del limite di arresto (questo non c'è ancora!)

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

------

3. Modifica per il pareggio

4. Modifica del trailing stop

5.Chiudere l'ordine


Puoi usare il punto 2 per modificare l'ordine, ma solo all'inizio della prossima barra.

 

Viene scritta una funzione per aprire 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);
           }
        }
      }
     } 
//=============================================== 
 
Ci sono sviluppatori MQL5 in questo thread? Sto facendo una domanda nel ramo sbagliato? Allora dimmi come fare una domanda agli sviluppatori? La domanda di cui sopra è elementare per un programmatore esperto...