Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 6

 

Camaradas, eu nunca fiz nenhum ajuste histórico, então eu não conheço os meandros da leitura do gráfico após a otimização.

Existe tal gráfico após a passagem anual 2014-2015, onde olhar e o que isso significa? Interessado na cor e localização dos cubos, por que alguns estão no centro, outros abaixo/abaixo, e dois/três no mesmo quadrado?

Obrigado pelo esclarecimento!

 
strongflex:
Não abre o comércio no testador. Qual poderia ser o problema aqui?)

Bem... Primeiro, você está tentando abrir um Sell at Ask price. Enquanto você está abrindo uma venda na Bid e uma compra na Ask.

Coloquei a pesquisa de dados RSI e sua passagem de nível em uma função. Tem também uma verificação de preço. Retorna sinais: para comprar, para vender, ou nada (-1)

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  UpperRSIlevel  = 70;          // Верхний уровень RSI
input int                  LowerRSIlevel  = 30;          // Нижний уровень RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore;    // Количество минут назад
int      periodRSI;        // Период расчёта RSI
int upperRSIlevel;         // Верхний уровень RSI
int lowerRSIlevel;         // Нижний уровень RSI
//---
double   prevRSIvalue0;    // Значение RSI для заданного тф xxx минут назад
double   prevRSIvalue1;    // Значение RSI для заданного тф xxx минут назад-x минут
//---
double   prevClose_0;      // Значение Close для заданного тф xxx минут назад
double   prevClose_1;      // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore;       // Время ххх минут назад
datetime timePrevBefore;   // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
   upperRSIlevel=(UpperRSIlevel<1?1:UpperRSIlevel>100?100:UpperRSIlevel);
   lowerRSIlevel=(LowerRSIlevel<0?0:lowerRSIlevel>99?99:LowerRSIlevel);
   if(upperRSIlevel<=lowerRSIlevel) upperRSIlevel=lowerRSIlevel+1;
   if(lowerRSIlevel>=upperRSIlevel) lowerRSIlevel=upperRSIlevel-1;
   /*

   */
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
         //--- получили сигнал на покупку
         Print("Сигнал на покупку ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на покупку
         //--- вызов функции открытия позиции на покупку
         }
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
         //--- получили сигнал на продажу
         Print("Сигнал на продажу ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на продажу
         //--- вызов функции открытия позиции на продажу
         }
      }
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE) {
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name,ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyClose(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime time) {
   if(time<0) return(-1);
   //---
   datetime array[], time0;
   if(CopyTime(symbol_name,timeframe,0,1,array)<0) return(-1);
   time0=array[0];
   if(CopyTime(symbol_name,timeframe,time0,time,array)<0) return(-1);
   datetime temptime=GetTime(symbol_name,timeframe,ArraySize(array)-1);
   if(array[0]==temptime && temptime<=time) return(ArraySize(array)-1);
   else return(ArraySize(array));
}
//+------------------------------------------------------------------+
datetime GetTime(string symbol_name,ENUM_TIMEFRAMES timeframe,int bar) {
   if(bar<0) return(-1);
   datetime array[];
   if(CopyTime(symbol_name,timeframe,bar,1,array)>0) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int SignalByRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int minutes_before, int upper_lev_rsi=70, int lower_lev_rsi=30) {
   //--- время 1x и 2x минут назад
   datetime time_before_0=TimeCurrent()-minutes_before*PeriodSeconds(PERIOD_M1);
   datetime time_before_1=TimeCurrent()-2*minutes_before*PeriodSeconds(PERIOD_M1);
   //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
   int shift_0=GetBarShift(symbol_name,timeframe,time_before_0);
   int shift_1=GetBarShift(symbol_name,timeframe,time_before_1);
   //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
   double prev_rsi_value_0=GetLastDataRSI(symbol_name,timeframe,shift_0);
   double prev_rsi_value_1=GetLastDataRSI(symbol_name,timeframe,shift_1);
   //--- значения цен закрытия баров 1х и 2х минут назад
   double prev_close_0=GetPriceClose(symbol_name,timeframe,shift_0);
   double prev_close_1=GetPriceClose(symbol_name,timeframe,shift_1);
   //--- отладочные сообщения
   string tf=EnumToString(TimeframeRSI);
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   Comment(
          "\nВремя проверки RSI: ",TimeCurrent(),", минуты времени проверки: ",server_time.min,
          "\nВремя ",minutes_before," минут назад: ",time_before_0,", бар ",tf," : ",shift_0,
          "\nВремя ",minutes_before*2," минут назад: ",time_before_1,", бар ",tf," : ",shift_1,
          "\nЗначение RSI ",minutes_before," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_0,4),
          "\nЗначение RSI ",minutes_before*2," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_1,4),
          //---
          "\nЗначение Close ",minutes_before," минут назад > ",tf," : ",DoubleToString(prev_close_0,Digits()),
          "\nЗначение Close ",minutes_before*2," минут назад > ",tf," : ",DoubleToString(prev_close_1,Digits())
          );
   //--- проверка наличия данных RSI
   if(prev_rsi_value_1>0 && prev_rsi_value_0>0) {
      //--- проверка условия на продажу
      if(prev_rsi_value_1<upper_lev_rsi && prev_rsi_value_0>upper_lev_rsi) {
         if(prev_close_0>SymbolInfoDouble(symbol_name,SYMBOL_BID)) return(OP_SELL);
         }
      //--- проверка условия на покупку
      if(prev_rsi_value_1>lower_lev_rsi && prev_rsi_value_0<lower_lev_rsi) {
         if(prev_close_0<SymbolInfoDouble(symbol_name,SYMBOL_ASK)) return(OP_BUY);
         }
      }
   return(-1);
}
//+------------------------------------------------------------------+
 
Vitaly Muzichenko:

Camaradas, eu nunca fiz nenhum ajuste histórico, então eu não conheço os meandros da leitura do gráfico após a otimização.

Existe tal gráfico após a passagem anual 2014-2015, onde olhar e o que isso significa? Interessado na cor e localização dos cubos, por que alguns estão no centro, outros abaixo/abaixo, e dois/três no mesmo quadrado?

Obrigado pelo esclarecimento!

Eu também nunca confiei em otimistas em tantos anos - acho que é um ajuste. Mas é um pouco como quanto mais rica a cor, melhor. E também - quanto mais blocos com cores saturadas, melhor. Mas o que fazer ainda mais com esta confusão - não consigo pensar. Sempre tentei construir sistemas adaptativos, e não com uma seleção estúpida de valores para a história de um testador.

Talvez haja alguém que possa nos explicar tudo isso

 
Artyom Trishkin:

Eu também nunca confiei em otimistas em tantos anos - penso neles como um remendo. Mas quanto mais saturada for a cor, melhor. E também - quanto mais blocos com cores saturadas, melhor. Mas o que fazer a seguir com esta confusão - não consigo pensar. Sempre tentei construir sistemas adaptativos, e não com uma seleção estúpida de valores para a história de um testador.

Talvez haja alguém que possa nos explicar tudo isso

O mais provável é que ninguém o faça. Restam 10-12 pessoas no fórum, algumas delas foram banidas e muitas delas não voltarão. Agora se você olhar para o fórum, cerca de 5-7 pessoas aparecem, metade delas não respondem a perguntas. Minha pergunta sobre o cronograma permanece sem resposta.
 
Vitaly Muzichenko:
É provável que ninguém explique. Restam 10-12 pessoas no fórum, algumas delas foram banidas e muitas delas não voltarão. Agora se você olhar para o fórum, há cerca de 5-7 pessoas, metade delas não responde a perguntas. Minha pergunta sobre o cronograma não foi respondida.
Tenho que olhar para o quarto fórum - vi uma explicação do otimizador lá uma vez há muito tempo, mas não me lembro do que se tratava ou onde estava...
 
Artyom Trishkin:
Você precisa olhar no quarto fórum - vi uma explicação do otimizador lá há algum tempo, mas não me lembro bem do que se tratava e onde estava...
Aqui está, só que não corresponde ao que eu recebi durante os testes, por isso fiz uma pergunta aos conhecedores.
 

Olá.

Você pode me dizer por que não é possível selecionar uma data do calendário suspenso se eu fizer isso em ambientes externos?
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Há alguma maneira de mudar para que você possa selecionar uma data em vez de digitá-la a partir do teclado?

 
Vitaly Muzichenko:

Camaradas, eu nunca fiz nenhum ajuste histórico, então eu não conheço os meandros da leitura do gráfico após a otimização.

Existe tal gráfico após a passagem anual 2014-2015, onde olhar e o que isso significa? Interessado na cor e localização dos cubos, por que alguns estão no centro, outros abaixo/abaixo, e dois/três no mesmo quadrado?

Obrigado pelo esclarecimento!

Vitaly Muzichenko:
Sim, muito provavelmente ninguém vai explicar. Restam apenas 10-12 pessoas no fórum, algumas delas foram banidas e muitas nunca mais voltaram. Agora, se você olhar para o fórum, cerca de 5-7 pessoas aparecem, metade delas não responde a perguntas. Minha pergunta sobre o cronograma ficou sem resposta.

Não há muito a explicar e ninguém está respondendo. O gráfico que você mostrou não tem sentido e como ele foi obtido é um mistério.

E a opção "Superfície bidimensional" na aba "Gráfico de otimização" do testador faz sentido (imho) quando queremos otimizar 2 parâmetros de entrada de um EA ou ver claramente, em quais valores de 2 parâmetros os resultados foram bons na história e se esses parâmetros são interdependentes, e se fazem sentido de todo.

Aqui está um exemplo da otimização de 2 parâmetros de entrada (talvez não seja o melhor, mas não consigo encontrar um exemplo melhor neste momento):


O eixo horizontal é o valor do 1º parâmetro em 16 incrementos, e o eixo vertical é o valor do 2º parâmetro, também em 16 incrementos. Quanto mais escuro o quadrado verde, maior o lucro (se a otimização pelo lucro) estava nos valores correspondentes dos parâmetros, quanto mais pálido, menor o lucro. O melhor resultado (por lucro histórico) foi no centro. O "monte" verde escuro parece estar em torno dele, o que sugere alguma dependência e regularidade entre estes 2 parâmetros e os parâmetros não são insignificantes, enquanto o resultado da otimização não é acidental. Portanto, vale a pena prestar atenção aos valores destes parâmetros 2x a partir do melhor resultado (no centro).

Em geral, tudo é muito simples. Quanto à forma de usá-la, bem, é uma questão de imaginação. Eu não olho para estes quadrados verdes por muito tempo ))

Seu gráfico tem apenas 0 nos dois eixos por alguma razão, e verticalmente estes 0's também são divididos em 3 passos intermediários, daí os "cubos um no centro, dois abaixo/cima, e dois/três no mesmo quadrado". E os resultados parecem aleatórios - "cubos" brancos e verdes são dispersos aleatoriamente. Portanto, o gráfico não tem sentido e não parece significar nada.

 
Olá.
Estou escrevendo minha própria dll para trabalhar com o banco de dados sqlite3 a partir do indicador. O ambiente de desenvolvimento de blocos de código funciona, mas não de forma correta e, ocasionalmente, trava com uma violação de acesso.
Perguntas iniciais:
1. É possível construir dlls em blocos de código corretamente ou apenas no Visual Studio? Exemplos simples (trabalho com Int, duplo) são construídos e funcionam. Empilha e trabalha com arquivos não - o programa trava.
2. não pude começar e trabalhar com __stdcall, somente com __cdecl. Nomes de funções distorcidos , e arquivos def em blocos de código não funcionam normalmente.
Estou procurando ajuda de usuários com conhecimento de causa.
Se já existe um tópico, por favor, peça ao Admin para colocá-lo no ramo apropriado.
 
mila.com:

Olá.

Você pode me dizer por que é impossível selecionar uma data do calendário suspenso se eu fizer isso em ambientes externos?
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Há alguma maneira de mudar para que a data possa ser selecionada em vez de inseri-la a partir do teclado?

input datetime CloseTime        = D'2016.09.11 15:50';