Eu escrevo indicadores, EAs, não mais de graça :) - página 6

 
KimIV >> :
Parâmetros de função incorretos. Verifique exatamente o que você passa para a função OrderClose().

Verifiquei-o... Realmente não sei qual é o problema... Eu já tentei tantas coisas diferentes %(

 

Boa noite novamente :)

Com um novo pedido. Percebi que, de qualquer forma, não conseguirei descobrir por conta própria.

Estou pedindo para escrever um EA baseado no indicador WATR (código EA abaixo). Quando o indicador faz uma curva, fecha a ordem aberta (se não tiver sido fechada por SL ou TP) e abre uma nova ordem na direção indicada pelo indicador. Abrimos apenas um pedido exatamente no ponto de inversão. Depois esperamos até a próxima inversão da EA.

Parâmetros de entrada: tamanho do lote, SL, TP, deslizamento. Eu acho que não esqueci nada :)

Cumprimentos, Svetlana. ICQ 320355718

Código do indicador:

//+------------------------------------------------------------------+
//| WATR.mq4
//| Escrito por WizardSerg sob o artigo konkop em |
//| "Comércio moderno" #4/2001 |
//| http://www.wizardserg.inweb.ru |
//| wizardserg@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Escrito por WizardSerg sob o artigo konkop em <Modern trading> #4/2001"
#link da propriedade "http://www.wizardserg.inweb.ru"
//----
#janela_do_cartão_indicador de propriedade
#property indicator_buffers 2
#indicador de propriedade_coral1 Coral
#indicador de propriedade_color2 DodgerBlue
//---- parâmetros de entrada
exterior inttern WATR_K = 10;
duplo exterior WATR_M = 4,0;
ATR externo interno = 21;
//---- buffers
duplo ExtMapBufferUp[];
duplo ExtMapBufferDown[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
SetIndexBuffer(0, ExtMapBufferUp);
ArraySetAsSeries(ExtMapBufferUp, true);
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
SetIndexBuffer(1, ExtMapBufferDown);
ArraySetAsSeries(ExtMapBufferDown, true);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
IndicatorShortName("WATR(" + WATR_K + ", " + WATR_M + ")");
SetIndexLabel(0, "WATR_Up");
SetIndexLabel(1, "WATR_Dn");
retorno(0);
}
//+------------------------------------------------------------------+
//| Função de desinicialização de indicador personalizada |
//+------------------------------------------------------------------+
int deinit()
{
//----
retorno(0);
}
//+------------------------------------------------------------------+
//| Função indicadora personalizada |
//+------------------------------------------------------------------+
bool AntiTrendBar(int i)
{
bool res = (TrendUp(i) && (Fechar[i] < Abrir[i]) ||||
(!TrendUp(i) && (Fechar[i] > Abrir[i]);
retorno(res);
}
//+------------------------------------------------------------------+
//| Função indicadora personalizada |||
//+------------------------------------------------------------------+
duplo valor CalcIndicValue(int i, bool trend)
{
duplo res = Fechar[i];
if(tendência)
res -= (WATR_K*Point + WATR_M*iATR(NULL, 0, ATR, i))
senão
res += (WATR_K*Point + WATR_M*iATR(NULL, 0, ATR, i)));
retorno(res);
}
//+------------------------------------------------------------------+
//| Função indicadora personalizada |
//+------------------------------------------------------------------+
bool TrendUp(int i)
{
return((Fechar[i+1] > ExtMapBufferUp[i+1]) &&
(ExtMapBufferUp[i+1] != EMPTY_VALUE))
}
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizada |
//+------------------------------------------------------------------+
int start()
{
limite int;
int counted_bars = IndicatorCounted();
//---- a última barra contada será recalculada
//---- primeiro valor indicador == preço - 1 ponto,
// isto é, considera que a tendência é ascendente
ExtMapBufferUp[Bars] = Fechar[Bars] - WATR_K*Point;
// limite = (barras_de_contagem > 0) ? (Barras - contadas_barras) : (Barras - 1);
limite = Barras - contadas_barras;
//---- laço principal
for(int i = limite; i >= 0; i--)
{
if(AntiTrendBar(i))
{
ExtMapBufferUp[i] = ExtMapBufferUp[i+1];
ExtMapBufferDown[i] = ExtMapBufferDown[i+1];
}
senão
{
if(TrendUp(i))
{
ExtMapBufferUp[i] = CalcIndicValue(i, verdadeiro);
if(ExtMapBufferUp[i] < ExtMapBufferUp[i+1])
ExtMapBufferUp[i] = ExtMapBufferUp[i+1];
ExtMapBufferDown[i] = EMPTY_VALUE;
}
senão
{
ExtMapBufferDown[i] = CalcIndicValue(i, falso);
if(ExtMapBufferDown[i] > ExtMapBufferDown[i+1])
ExtMapBufferDown[i] = ExtMapBufferDown[i+1];
ExtMapBufferUp[i] = EMPTY_VALUE;
}
}
// preço de travessia
if(TrendUp(i) && (Close[i] < ExtMapBufferUp[i])
{
ExtMapBufferDown[i] = CalcIndicValue(i, falso);
ExtMapBufferUp[i] = EMPTY_VALUE;
}
if((!TrendUp(i)) && (Fechar[i] > ExtMapBufferDown[i])
{
ExtMapBufferUp[i] = CalcIndicValue(i, verdadeiro);
ExtMapBufferDown[i] = EMPTY_VALUE;
}
}
retorno(0);
}
//+------------------------------------------------------------------+



 
rusmos писал(а) >>

Desculpe-me, mas você poderia escrever algum código para o seguinte problema - o primeiro lote, por exemplo 0,1, e cada lote seguinte aumenta em um certo valor dado.

Agradecemos antecipadamente.

Procure neste fórum, tal já solicitado e escrito...

Em qualquer caso há algo semelhante...

 
StatBars >> :

Procure neste fórum, foi perguntado e escrito sobre...

Obrigado >> Há cerca de três horas que ando bisbilhotando no fórum, encontrei muita coisa, mas não isto.

 
StatBars >> :

Procure neste fórum, ele já foi perguntado e escrito antes...

E o código é provavelmente 10 termos, no máximo.

Mas suponho que aqui eles não gostam de coisas mesquinhas.

 
rusmos >> :

E o código é provavelmente 10 termos, no máximo.

Mas suponho que os profissionais não gostam de brincadeiras aqui.

Seria bom formalizar a tarefa não apenas aproximadamente, mas concretamente, de modo que alguém a assumisse.

 
rusmos писал(а) >>

E o código é provavelmente 10 termos, no máximo.

Mas os profissionais provavelmente não vão para as pequenas coisas aqui.

Por favor, formule sua pergunta corretamente. O primeiro pedido, os subseqüentes. A primeira é de quê? Desde o início do Universo, ou desde o dia em que Cristo veio, ou da criação do mundo, ou talvez desde o momento em que você tomou o café da manhã e foi dar uma volta? Quais são as perguntas, quais são as respostas.

 
rusmos писал(а) >>

E o código é provavelmente 10 termos, no máximo.

Mas acho que eles não vão para as pequenas coisas aqui.

extern double RISK=20;


lotsize=MarketInfo(Symbol(),MODE_LOTSIZE)*0.01;
Balance=AccountBalance()*( RISK/100);
lots=NormalizeDouble( Balance/ lotsize,2); // - это и есть лот для открытия позиции
O código não só aumenta o lote, mas também o reduz, tudo depende do depo, o depo sobe - o lote sobe... Achei que você precisava disto...
 
sol >> :

Seria bom formalizar a tarefa não apenas aproximadamente, mas concretamente, de modo que alguém a assumisse.

OK. O primeiro lote é Comprar com o lote 0,1. Em resposta, o SellStop é imediatamente fixado em 20 pontos a partir do fundo com 0,2 lote (ou seja, aumentar em 0,1)

Além disso, se a Venda desencadeou, na resposta estabelecemos o ByStop com 0,3 lote (ou seja, aumentar o ÚLTIMO lote novamente em 0,1) e, em princípio, mais ou menos.

É importante que a magnitude do aumento do lote seja ajustada a seu critério.

Bem, respectivamente, duas opções interessantes. Adição e multiplicação.

>> Ugh, eu acho que é isso).

 
StatBars >> :
O código não só aumenta o lote, mas também o diminui, tudo depende do depo, o depo sobe - o lote sobe... Achei que você precisava disto...

O tamanho do depósito não importa.