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

 
DanilaMactep:

Eu fiz o que você aconselhou com o código. No início do código tenho uma condição para escolher o tipo de parada - atp ou fixa

Depois comentei minha normalização e a coloquei desta forma

O cálculo do lucro é o próximo no código. Sem problemas e depois de calcular o lucro adicionei a fórmula assustadora que fui aconselhado a usar.

Tudo foi compilado sem erros. Mas quando eu fiz o teste, o erro aparece no registro, é dividido por zero até onde eu entendo e o teste é interrompido. Onde eu fiz asneira ou o que fiz de errado?


Basta apagá-lo.

     sl = fabs(OrderOpenPrice()-OrderStopLoss())/_Point;// ПРИСВОИЛ ЗНАЧЕНИЕ КАК СОВЕТОВАЛИ
     //sl= NormalizeDouble(sl,Digits());// НОРМАЛИЗАЦИЯ ЗНАЧЕНИЯ СТОП ЛОССА ДЛЯ ОТКРЫТИЯ СДЕЛКИ ТО  ЧТО БЫЛО ЗАКОМЕНТИРОВАЛ
 
DanilaMactep:

Eu fiz o que você aconselhou com o código. No início do código tenho uma condição para escolher o tipo de parada - atp ou fixa

Depois comentei minha normalização e a coloquei desta forma

O cálculo do lucro é o próximo no código. Sem problemas e depois de calcular o lucro adicionei a fórmula assustadora que fui aconselhado a usar.

Tudo foi compilado sem erros. Mas quando eu executei o teste o erro aparece no registro, é dividido por zero até onde eu entendo e o teste é interrompido. Onde eu estraguei tudo aqui ou o que não fiz direito?


Apenas quando lhe são dadas duas opções diferentes, você não deve aplicar ambas ao mesmo tempo.

Você está contando sl como duas escolhas diferentes

sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА

ou

sl= razmer_fikc_sl*Point; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ

você obtém o valor em valores de preço. E a fórmula deve conter pontos de ... a ....

Portanto, a parada a uma distância do preço é iATR(.........)/_Point ou razmer_fikc_sl mas usar dois valores diferentes na função não é muito conveniente, portanto é melhor deixar apenas uma variante

double lot =MathFloor((Free*MaxRisk/100)/(sl/Point*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА

E não se esqueça que o sl deve ser calculado ANTES de tentar calcular o tamanho do lote.

 
sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
Certifique-se de
 

Faça-o...

void OnTick()
  {
//---
if(tip_sl==en_po_atr)
     { //ЕСЛИ ТИП СТОП ЛОССА СТОИТ ПО АТР ТО ВЫСЧИТЫВАЕМ ЕГО ИЗ АТР
     sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
     else //ИНАЧЕ- ТО ЕСТЬ ЕСЛИ СТОП ЛОСС ФИКСИРОВАННЫЙ В ПУНКТАХ
     {
     sl= razmer_fikc_sl; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
double lot =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА
 
MakarFX:

Basta apagá-lo.

Eu consertei a linha e o teste começou - MUITO OBRIGADO! Só não entendia por que ao obter o stoploss da iATR em uma variável, por que dividir pelo ponto no final? P/S Estou tendo dificuldades reais com a matemática, não estou brincando :-( Mas acho que o teste correu bem e com um lote 100 colocou o mínimo, e com um lote 10000 diferente o tempo todo, então funciona bem... Obrigado novamente pela ajuda...

 
DanilaMactep:

Eu consertei o fio e o teste começou - OBRIGADO! Só não entendia por que ao obter o stoploss da iATR em uma variável, por que dividir pelo ponto no final? P/S Estou tendo dificuldades com matemática, não estou brincando :-( Mas acho que o teste correu bem e a 100 depósito o lote é mínimo, e a 10000 depósito é sempre diferente, então funciona bem... Obrigado novamente pela ajuda...

ATR dá um número decimal, como 0,00120

razmer_fikc_sl é um número inteiro.

para calcular o lote, você precisa de pontos, ou seja, inteiros

ATR/Ponto dá um número inteiro

 
É um tópico antigo, mas não consigo encontrar uma solução. Como especificar o intervalo de tempo (por exemplo, das 12:00 às 14:00) e abrir um pedido apenas uma vez dentro desse intervalo e que atenda a alguma condição (RSI<30 por exemplo).

Ou

Algo análogo ao sono: abrir um pedido em uma determinada condição e não fazer nada durante 2 horas. Mas o sono não funciona no testador.
 
Порт-моне тв:
Este é um tema antigo, mas não consigo encontrar uma solução. Como especificar o horário (por exemplo, das 12:00 às 14:00) e apenas uma vez neste horário abrir uma ordem que satisfaça alguma condição (RSI<30 por exemplo).

Ou

Algo análogo ao sono: abrir um pedido em uma determinada condição e não fazer nada durante 2 horas. Mas o sono não funciona no testador.

primeira condição - chegou o momento
segunda condição - rsi
terceira condição - não existe tal ordem no histórico ao preço de abertura em intervalos

 

Boa tarde.

Há um indicador Elliott Wave Oscillator, ele fornece valores numéricos da variável EWO. Há EWOs positivos que estão acima de zero e EWOs negativos que estão abaixo de zero.

A partir das últimas 100 leituras de EWO, é necessário calcular o valor médio de EWO positivo e separadamente o valor médio de EWO negativo

Eu recebo os valores do indicador duplo EWO=iCustom(Symbol(),0, "Elliott Wave Oscillator",0,0);

Favor informar qual código mql4 pode implementar isto em um EA ?


Consegui encontrar a média do modulo.

avarage_EWO = 0;
for(int g=0;g<100;g++)
avarage_EWO = avarage_EWO + MathAbs( iCustom(Symbol(),0, "Elliott Wave Oscillator",0,g) ); // modulo average
avarage_EWO = avarage_EWO/100;


Mas como calcular separadamente a média positiva e a média negativa do EWO ?

Obrigado!



 

Take Profit triggering

Não consigo descobrir como e para que serve o ORDER_REASON_TP,

Eu sei como funciona oDEAL_REASON_TP, mas não sei o que está acontecendo com os pedidos aqui