o próprio compilador substitui os tipos no momento da chamada de função modelo, se tal chamada ainda não estava no código, então o compilador criará outra cópia de função e definirá os próprios tipos - bem, como se logicamente - um modelo
se a questão é sobre como definir o tipo em tal função, use
typename
UPD: adicionado ao exemplo acima o tipo de parâmetro impressoras:
//--- buffers (массивы под буферы индикатора)//--------------------------------------------------------------------double RSI[]; // буфер под RSI//--------------------------------------------------------------------double MAr1_fast[]; // буфер под быструю МАdouble MAr2_slow[]; // буфер под медленную МАdouble MAr2_slowColor[]; // буфер под цвета медленной МА//--------------------------------------------------------------------double MAr3_slow_glob[]; // буфер под глобальную медленную МАdouble MAr3_slow_globColor[]; // буфер под цвета глобальной медленной МА//--------------------------------------------------------------------
Essencialmente: o indicador desenha 4 linhas: as duas primeiras são apenas de uma cor, as duas seguintes são bicolores (elas mudam de cor nas dobras).
Bicolor deve-se à forma de desenhar DRAW_COLOR_LINE.
Pergunta: a primeira linha (buffers 2 e 3 no código acima) está perfeitamente desenhada e todos os códigos escritos para ela no OnInit funcionam; a segunda linha aparece por alguma razão, por exemplo, a linha não funciona:
PlotIndexSetString (4, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Isto é, ao invés do texto que eu defino na janela de dados, apenas o nome do indicador é exibido no lugar do buffer. Embora a linha em si seja traçada, e é, como deveria ser, multicolorida. Eu acho que o truque está na mudança de numeração? Por exemplo, não tenho certeza por que na parte superior do código, quando declaro a última linha com a diretiva #propriedade, o índice deve ser 4 e não 5, já que 4 buffers já foram usados antes. Existe alguma relação entre numeração de linhas ao declarar com #propriedade e numeração tampão ao ligar com arrays no OnInit?
Por favor, informe o que está errado no código acima. Talvez alguém possa encontrar um exemplo de indicador onde pelo menos duas linhas são desenhadas usando o método de desenho DRAW_COLOR_LINE....
Mais uma pergunta relacionada: como os amortecedores de linha coloridos ficam amarrados juntos? Quero dizer, como o código compilado sabe que se eu colocar um valor em um buffer de cor, essa cor deve ser usada para colorir uma linha de algum outro buffer?
Boa tarde. Estou diante de algo estranho ao escrever um indicador em MQL5 (indicador em uma subjanela separada, 4 linhas).
As descrições iniciais do buffer são as seguintes:
A seguir, no OnInit:
Essencialmente: o indicador desenha 4 linhas: as duas primeiras são apenas de uma cor, as duas seguintes são bicolores (elas mudam de cor nas dobras).
Bicolor deve-se à forma de desenhar DRAW_COLOR_LINE.
Pergunta: a primeira linha (buffers 2 e 3 no código acima) está perfeitamente desenhada e todos os códigos escritos para ela no OnInit funcionam; a segunda linha aparece por alguma razão, por exemplo, a linha não funciona:
Isto é, ao invés do texto que eu defino na janela de dados, apenas o nome do indicador é exibido no lugar do buffer. Embora a linha em si seja traçada, e é, como deveria ser, multicolorida. Eu acho que o truque está na mudança de numeração? Por exemplo, não tenho certeza por que na parte superior do código, quando declaro a última linha com a diretiva #propriedade, o índice deve ser 4 e não 5, já que 4 buffers já foram usados antes. Existe alguma relação entre numeração de linhas ao declarar com #propriedade e numeração tampão ao ligar com arrays no OnInit?
Por favor, informe o que está errado no código acima. Talvez alguém possa encontrar um exemplo de indicador onde pelo menos duas linhas são desenhadas usando o método de desenho DRAW_COLOR_LINE
Mais uma pergunta relacionada: como os amortecedores de linha coloridos ficam amarrados juntos? Quero dizer, como o código compilado sabe que se eu colocar um valor em um buffer de cor, essa cor deve ser usada para colorir uma linha de algum outro buffer?
Os mapeamentos são numerados de forma diferente dos tampões.
PlotIndexSetString (3, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Bom dia. Quero escrever um EA baseado na medição do ângulo de inclinação de uma média móvel (ou melhor, um conjunto delas, ou seja, o Jacaré), para que o EA dê um alerta sobre um forte impulso de preço, de preferência com um pequeno atraso. Por favor, informe como medir o ângulo do MA ou "diga ao EA" que o pulso ocorreu. Talvez já existam maneiras conhecidas de se fazer isso. Ou, por exemplo, um indicador livre baseado no cálculo do impulso?
Escreveu uma função para encontrar o número de barra de um fractal em 3 barras. No gráfico online parece encontrá-lo corretamente. Mas, durante os testes visuais no testador, ele mente. Algum dos profissionais pode dar uma olhada no código e encontrar alguns erros?
Eu ficaria muito grato.
//+----------------------------------------------------------------------------+//| Описание : Возвращает номер бара трёхбарного фарактала по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| nf - номер экстремума ( 0 - последний) |//+----------------------------------------------------------------------------+int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
if(sy=="" || sy=="0") sy=Symbol();
int nlext=0,k=iBars(sy,tf);
nlext=0;
if(mode==MODE_UPPER)
{
for (int i=2; i<=k; i++)
{
if(High[i]>High[i+1] && High[i]>High[i-1])
{
nlext++;
if(nlext>ne) return(i);
}
}
}
if(mode==MODE_LOWER)
{
for (i=2; i<=k; i++)
{
if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
{
nlext++;
if(nlext>ne)
{
//Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);return(i);
}
}
}
}
Print("Бар локального экстремума не найден");
return(-1);
}
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
Boa tarde. QUE CÓDIGO DEVO ACRESCENTAR PARA QUE O INDICADOR DEIXE DE FUNCIONAR NO TESTADOR APÓS UM MÊS? OU SEJA, EU ESCREVI TUDO OK ! MAS QUANDO EU FAÇO UM BACKTEST FUNCIONA NOVAMENTE. (mgl4)
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
datetime data=D'2020.09.16 20:07'; // Time Blockif(TimeCurrent()>data)
{
Print("Демонстрационный период закончился, покупайте индикатор :)");
Alert("Демонстрационный период закончился, покупайте индикатор :)");
return(INIT_FAILED);
}
if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
Comment("Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :)");
return(0);
}
Eu queria colocar uma condição no ciclo de fechamento do pedido nodia da abertura, para que os pedidos que fossem abertos na sexta-feira não fossem fechados.
while (OrdersTotal()>0)
{
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
elsePrint("NoMagic ", OrderMagicNumber()); // for Debug
}
elsePrint( "Error when order select ", GetLastError());
}
Boa tarde. QUE CÓDIGO DEVO ACRESCENTAR PARA QUE O INDICADOR DEIXE DE FUNCIONAR NO TESTADOR APÓS UM MÊS? OU SEJA, EU ESCREVI TUDO OK ! MAS QUANDO EU FAÇO UM BACKTEST FUNCIONA NOVAMENTE. (mgl4)
Você precisa escrever este código não no OnInit, mas no OnTick().
Eu queria colocar uma condição no ciclo de fechamento do pedido nodia de abertura do pedido, para que os que fossem abertos na sexta-feira não fossem fechados.
Tente desta forma:
for(int is=OrdersTotal()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
else Print("NoMagic ", OrderMagicNumber()); // for Debug
}
else Print( "Error when order select ", GetLastError());
}
Como posso saber o tipo de parâmetro de entrada?
o próprio compilador substitui os tipos no momento da chamada de função modelo, se tal chamada ainda não estava no código, então o compilador criará outra cópia de função e definirá os próprios tipos - bem, como se logicamente - um modelo
se a questão é sobre como definir o tipo em tal função, use
typenameUPD: adicionado ao exemplo acima o tipo de parâmetro impressoras:
2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)
2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, nome datilografia = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, nome datilografia = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) 5
2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)
2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, nome datilografia = duplo
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, nome datilografia = duplo
2020.09.16 18:58:21.681 tst (EURUSD,M5) 40
UPD: adicionado__FUNCSIG__ a este exemplo
Boa tarde.
Estou diante de algo estranho ao escrever um indicador em MQL5 (indicador em uma subjanela separada, 4 linhas).
As descrições iniciais do buffer são as seguintes:
A seguir, no OnInit:
Essencialmente: o indicador desenha 4 linhas: as duas primeiras são apenas de uma cor, as duas seguintes são bicolores (elas mudam de cor nas dobras).
Bicolor deve-se à forma de desenhar DRAW_COLOR_LINE.
Pergunta: a primeira linha (buffers 2 e 3 no código acima) está perfeitamente desenhada e todos os códigos escritos para ela no OnInit funcionam;
Isto é, ao invés do texto que eu defino na janela de dados, apenas o nome do indicador é exibido no lugar do buffer. Embora a linha em si seja traçada, e é, como deveria ser, multicolorida.a segunda linha aparece por alguma razão, por exemplo, a linha não funciona:
Eu acho que o truque está na mudança de numeração? Por exemplo, não tenho certeza por que na parte superior do código, quando declaro a última linha com a diretiva #propriedade, o índice deve ser 4 e não 5, já que 4 buffers já foram usados antes. Existe alguma relação entre numeração de linhas ao declarar com #propriedade e numeração tampão ao ligar com arrays no OnInit?
Por favor, informe o que está errado no código acima. Talvez alguém possa encontrar um exemplo de indicador onde pelo menos duas linhas são desenhadas usando o método de desenho DRAW_COLOR_LINE....
Mais uma pergunta relacionada: como os amortecedores de linha coloridos ficam amarrados juntos? Quero dizer, como o código compilado sabe que se eu colocar um valor em um buffer de cor, essa cor deve ser usada para colorir uma linha de algum outro buffer?
Boa tarde.
Estou diante de algo estranho ao escrever um indicador em MQL5 (indicador em uma subjanela separada, 4 linhas).
As descrições iniciais do buffer são as seguintes:
A seguir, no OnInit:
Essencialmente: o indicador desenha 4 linhas: as duas primeiras são apenas de uma cor, as duas seguintes são bicolores (elas mudam de cor nas dobras).
Bicolor deve-se à forma de desenhar DRAW_COLOR_LINE.
Pergunta: a primeira linha (buffers 2 e 3 no código acima) está perfeitamente desenhada e todos os códigos escritos para ela no OnInit funcionam;
Isto é, ao invés do texto que eu defino na janela de dados, apenas o nome do indicador é exibido no lugar do buffer. Embora a linha em si seja traçada, e é, como deveria ser, multicolorida.a segunda linha aparece por alguma razão, por exemplo, a linha não funciona:
Eu acho que o truque está na mudança de numeração? Por exemplo, não tenho certeza por que na parte superior do código, quando declaro a última linha com a diretiva #propriedade, o índice deve ser 4 e não 5, já que 4 buffers já foram usados antes. Existe alguma relação entre numeração de linhas ao declarar com #propriedade e numeração tampão ao ligar com arrays no OnInit?
Por favor, informe o que está errado no código acima. Talvez alguém possa encontrar um exemplo de indicador onde pelo menos duas linhas são desenhadas usando o método de desenho DRAW_COLOR_LINE
Mais uma pergunta relacionada: como os amortecedores de linha coloridos ficam amarrados juntos? Quero dizer, como o código compilado sabe que se eu colocar um valor em um buffer de cor, essa cor deve ser usada para colorir uma linha de algum outro buffer?
Os mapeamentos são numerados de forma diferente dos tampões.
Isto deve funcionar.
Boa tarde a todos!
Fiz uma função para modificar a perda de carga. Mas quando funciona, dá EURUSD,H1: OrderModify error 130.
E o preço está longe do local onde deve ser fixado o stoploss.
Aqui está a função:
void open_bu(string walpa, int op) { bool err; int spred=(int)MarketInfo(walpa,MODE_SPREAD); double point=MarketInfo(walpa,MODE_POINT); int digits=(int)MarketInfo(walpa,MODE_DIGITS); for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa) { if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) ) { err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0)) { Print(walpa," ",spred," ",point," ",digits," ",NormalizeDouble(OrderOpenPrice()-spred*point, digits)); err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } } } return; }Escreveu uma função para encontrar o número de barra de um fractal em 3 barras. No gráfico online parece encontrá-lo corretamente. Mas, durante os testes visuais no testador, ele mente. Algum dos profissionais pode dar uma olhada no código e encontrar alguns erros?
Eu ficaria muito grato.
Boa tarde. QUE CÓDIGO DEVO ACRESCENTAR PARA QUE O INDICADOR DEIXE DE FUNCIONAR NO TESTADOR APÓS UM MÊS? OU SEJA, EU ESCREVI TUDO OK ! MAS QUANDO EU FAÇO UM BACKTEST FUNCIONA NOVAMENTE. (mgl4)
Olá!
Eu queria colocar uma condição no ciclo de fechamento do pedido nodia da abertura, para que os pedidos que fossem abertos na sexta-feira não fossem fechados.
Boa tarde. QUE CÓDIGO DEVO ACRESCENTAR PARA QUE O INDICADOR DEIXE DE FUNCIONAR NO TESTADOR APÓS UM MÊS? OU SEJA, EU ESCREVI TUDO OK ! MAS QUANDO EU FAÇO UM BACKTEST FUNCIONA NOVAMENTE. (mgl4)
Você precisa escrever este código não no OnInit, mas no OnTick().
Olá!
Eu queria colocar uma condição no ciclo de fechamento do pedido nodia de abertura do pedido, para que os que fossem abertos na sexta-feira não fossem fechados.
Tente desta forma:
for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES)) { if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) { if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error, " ",Symbol()); } else error=0; } else Print("NoMagic ", OrderMagicNumber()); // for Debug } else Print( "Error when order select ", GetLastError()); }