Feito, fez um modelo vazio, preparou tudo que era necessário para a função iCustom().
Coloco o indicador iCrossAD que me interessa na função.
A função funciona, ela encontra os índices das setas para cima e para baixo mais externas corretamente, mas os valores de preço em que essas setas foram definidas estão errados.
O código é curto, então vou colocá-lo aqui mesmo, vou anexar os arquivos deste assessor e indicador só para o caso de.
//+------------------------------------------------------------------+//| TestDoEasyPart08.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://mql5.com/ru/users/artmedia70"#property version"1.00"#property description""#property strict//--- includes#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---inputstring Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----inputuint InpPeriodFind = 400; // Bars for calculateinputuint InpUnheckedBars = 2; // Unchecked barsinputuint InpPeriodIND = 21; // CCI period//--- global variables
CEngine engine;
CTrade trade;
CPositionInfo apos;
CSymbolInfo asymbol;
uint period_find = InpPeriodFind; //Number bars for calculateint CrossAD; //Хэндл индикатора iCrossADdouble Buf_Arrow_Sell[], //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
Last_Arrow_Sell_volume, //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
Last_Arrow_Sell_index; //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
double Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
ArraySetAsSeries(Buf_Arrow_Buy, true);
ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
if (CrossAD == INVALID_HANDLE)
{
Print("Не удалось создать описатель индикатора iCrossAD!");
return(INIT_FAILED);
}
elsePrint("Хендл iCrossAD = ",CrossAD);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- delete objectsObjectsDeleteAll(0,"",-1);
Comment("");
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
int n=0;
if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
{
Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
return;
}
for(n=0; n<period_find; n++)
{
if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
}
Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index = n;
Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
{
Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
return;
}
for(n=0; n<period_find; n++)
{
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
}
Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
Last_Arrow_Sell_index = n;
Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
Comment("-------------------------",
"\n Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,
"\n Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,
"\n ---------------------- ",
"\n Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,
"\n Last_Arrow_Sell_index = ",Last_Arrow_Sell_index
);
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
if(!MQLInfoInteger(MQL_TESTER))
engine.OnTimer();
}
Pressione Ctrl+D, arraste o mouse ao longo das linhas indicadoras e olhe na janela de dados para ver quais os valores que seus amortecedores têm.
Se entendi bem, eu estava procurando um gato na sala que não está lá... A matriz não foi preenchida com preços, mas com os valores do indicador naquela época? Obrigado, vou repensar.
Uma última pergunta - o compilador me dá 2 avisos
sinal de desajuste Test_iCustom.mq5 79 20
sinal de desajuste Test_iCustom.mq5 92 20
Eu não consigo entender a razão deles, por favor, me diga. O que significa "desajuste de sinal" (tradutor de Yandex)??
Se entendi bem, eu estava procurando um gato na sala que não está lá... A matriz não foi preenchida com preços, mas com os valores do indicador naquela época? Obrigado, vou repensar.
Uma última pergunta - o compilador me dá 2 avisos
sinal de desajuste Test_iCustom.mq5 79 20
sinal de desajuste Test_iCustom.mq5 92 20
Eu não consigo entender a razão deles, por favor, me diga. O que significa "desajuste de sinal" (tradutor Yandex)?
Você pode estar perdendo um sinal de número. Mostrar estas linhas de código.
Você pode me dizer o que está errado com o racionamento do lote?
Tudo está errado. Leia o artigo "O que verifica se um EA deve passar...". Há ali uma função pronta para uso.
Feito, fez um modelo vazio, preparou tudo que era necessário para a função iCustom().
Coloco o indicador iCrossAD que me interessa na função.
A função funciona, ela encontra os índices das setas para cima e para baixo mais externas corretamente, mas os valores de preço em que essas setas foram definidas estão errados.
O código é curto, então vou colocá-lo aqui mesmo, vou anexar os arquivos deste assessor e indicador só para o caso de.
Este é o aspecto das entradas de registro na guia "Especialistas".
2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0
2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0
2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0
2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0
Este é o aspecto das entradas de registro na guia "Especialistas".
2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0
Em vez do preço pelo qual as setas foram criadas = -11211905.17483469
Sergey Voytsekhovsky:
...
Em vez dos preços aos quais as setas foram criadas = -11211905.17483469
Pressione Ctrl+D, mova o mouse ao longo das linhas do indicador e veja na janela de dados quais os valores que seus amortecedores têm.
Pressione Ctrl+D, arraste o mouse ao longo das linhas indicadoras e olhe na janela de dados para ver quais os valores que seus amortecedores têm.
Se entendi bem, eu estava procurando um gato na sala que não está lá... A matriz não foi preenchida com preços, mas com os valores do indicador naquela época? Obrigado, vou repensar.
Uma última pergunta - o compilador me dá 2 avisos
sinal de desajuste Test_iCustom.mq5 79 20
sinal de desajuste Test_iCustom.mq5 92 20
Eu não consigo entender a razão deles, por favor, me diga. O que significa "desajuste de sinal" (tradutor de Yandex)??
Se entendi bem, eu estava procurando um gato na sala que não está lá... A matriz não foi preenchida com preços, mas com os valores do indicador naquela época? Obrigado, vou repensar.
Uma última pergunta - o compilador me dá 2 avisos
sinal de desajuste Test_iCustom.mq5 79 20
sinal de desajuste Test_iCustom.mq5 92 20
Eu não consigo entender a razão deles, por favor, me diga. O que significa "desajuste de sinal" (tradutor Yandex)?
Você pode estar perdendo um sinal de número. Mostrar estas linhas de código.
Você pode estar perdendo um sinal de número. Mostrar estas linhas de código.
O segundo é exatamente o mesmo (loops para encontrar valores não zero em arrays "Arroys").
Quais são os tipos de variáveis n e period_find ? A coisa mais importante que eles não mostraram...
Experimente:
Por que você declara uma variável de laço no nível do manipulador OnTick()?
Você pode fazer desta maneira:
Você pode remover n declaração da OnTick() - não precisamos dela lá.
Quais são os tipos de variáveis n e period_find ? A coisa mais importante e não mostrou...