[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 69

 
Por favor, alguém veja o meu post anterior (na página 67). Não consigo encontrar o erro - as ordens pendentes não estão sendo definidas.
 
nemo811:
Por favor, alguém veja o meu post anterior (na página 67). Não consigo encontrar o erro - as ordens pendentes não estão sendo definidas.

Não há engano. Você deveria ser mais cuidadoso.

#property copyright "Copyright © 2010, Хлыстов Владимир"
#property link "cmillion@narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern int stoploss = 0; //уровень выставления SL, если 0, то SL не выставляется
extern int takeprofit = 0; //уровень выставления TP, если 0, то TP не выставляется
extern int Magic = 123456; //уникальный номер ордера
extern bool BUY = false; //открыть ордер BUY
extern bool SELL = false; //открыть ордер SELL
extern bool BUYSTOP = false; //открыть ордер BUYSTOP
extern bool SELLSTOP = false; //открыть ордер SELLSTOP
extern double Lot = 0.1; //объем ордера
extern int slippage = 3; //Максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");
}
if (SELL)
{ 
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0; 
OPENORDER ("Sell");
}
if (BUYSTOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy Stop");
}
if (SELLSTOP)
{ 
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0; 
OPENORDER ("Sell Stop");
}
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(string ord)
{
int error,err;
while (true)
{ error=true;
if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"BUY",Magic,0,Blue);
if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,"SELL",Magic,0,Red);
if (ord=="BuyStop" ) error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask,Digits),SL,TP,"BUYSTOP",Magic,0,Blue);
if (ord=="SellStop") error=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid,Digits),SL,TP,"SELLSTOP",Magic,0,Red);
if (error==-1) //неудачная покупка OK
{ 
ShowERROR();
err++;Sleep(2000);RefreshRates();
}
if (error || err >10) return;
}
return;
} 
//--------------------------------------------------------------------
void ShowERROR()
{
int err=GetLastError();
switch ( err )
{ 
case 1: return;
case 2: Alert("Нет связи с торговым сервером ",Symbol());return;
case 3: Alert("Error неправильные параметры ",Symbol());return;
case 130: Alert("Error близкие стопы Ticket ",Symbol());return;
case 134: Alert("Недостаточно денег ",Symbol());return;
case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
case 129: Alert("Error Неправильная цена ",Symbol());return;
case 131: Alert("Error Неправильный объем ",Symbol());return;
case 4200:Alert("Error Объект уже существует ",Symbol());return;
default: Alert("Error ",err," ",Symbol());return;
}
}
//--------------------------------------------------------------------
 
gince:

Não há engano. Você precisa ser mais cuidadoso


Não, não, não, não, não. Você está olhando para o posto errado. Há outro logo abaixo :))). A versão que você verificou não especifica o nível do preço atual (somente o preço atual) ao qual o pêndulo deve ser fixado. Obrigado por seu feedback.
 
nemo811:

Não, não, não. Você olhou para um posto errado. Há outro logo abaixo :))). A versão que você verificou não mostra o nível a partir do preço atual (mostra apenas o preço atual), ao qual o pingente deve ser ajustado. Obrigado por seu feedback.

Algo com a chamada de função OPENORDER() ou a própria função.

Funciona assim

se (BUYSTOP)

{

if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); caso contrário TP=0;

if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); caso contrário SL=0;

int error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);

}

 
gince:

Algo com a chamada de função OPENORDER() ou a própria função.

Funciona assim

se (BUYSTOP)

{

if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); caso contrário TP=0;

if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); caso contrário SL=0;

int error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);

}


Aaaaaaaaaaaaah!!! Deuses dos computadores!!! Eu já passei por isso dez vezes! Por que não está funcionando?! O principal é que o mercado está aberto. Os pendentes são escritos exatamente sobre o mesmo princípio. O que está faltando? :)))))))
 

Favor aconselhar como inserir o TrailingStopFrCnSAR_v2 no Expert Advisor, que é descrito no tutorial?

Como eu desabilito o rastreamento de pedidos, para que funcione quando outro EA coloca um pedido pendente ou abre um pedido?

Arquivos anexados:
 

Urrrrrrra!!!!!!!! Encontrei o bug!

Se alguém estiver interessado, aqui está uma versão funcional:

#direitos autorais "Copyright © 2010, Khlystov Vladimir"
#p

roperty link "cmillion@narod.ru
#property show_inputs
//--------------------------------------------------------------------
stoploss int externo = 0; // nível de exposição do SL, se 0, SL não for exposto
lucro int int externo = 0; //t nível de TP, se 0, TP não é exibido
magia int int externa = 123456; //número de um pedido
bool BUY = falso; //abrir pedido de BUY
venda externa = falso; //abrir ordem de venda
bool BUYSTOP externo = falso; //abrir ordem BUYSTOP
bool SELLSTOP externo = falso; //abrir ordem SELLSTOP
Lote duplo externo = 0,1; // volume do pedido
escorregamento interno externo = 3; // desvio de preço máximo permitido para ordens de mercado
Distância interna externaSet = 20; //Mercado distância
//--------------------------------------------------------------------
duplo SL,TP;
//--------------------------------------------------------------------
int start()
{
se (COMPRAR)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); caso contrário TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); caso contrário SL=0;
OPENORDER ("Comprar");
}
se (VENDER)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); caso contrário TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); caso contrário SL=0;
OPENORDER ("Sell");
}
se (BUYSTOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); caso contrário TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); caso contrário SL=0;
OPENORDER ("Buy Stop");
}
se (SELLSTOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); caso contrário TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); caso contrário SL=0;
OPENORDER ("Sell Stop");
}
retorno(0);
}
//--------------------------------------------------------------------
OPENORDER(string ord) vazio
{
int error,err;
enquanto (verdadeiro)
{ erro=verdadeiro;
if (ord==="Buy" ) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
if (ord==="Sell") error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,",Magic,0);
if (ord==="Buy Stop" ) error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);
if (ord==="Sell Stop") error=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),slippage,SL,TP,",Magic,0);
se (erro==-1) //failure
{
ShowERROR();
err++;Sleep(2000);RefreshRates();
}
se (erro ||| err >10) retornar;
}
retornar;
}
//--------------------------------------------------------------------
ShowERROR nulo()
{
int err=GetLastError();
interruptor ( err )
{
caso 1: devolução;
caso 2: Alerta("Sem conexão com o servidor comercial ",Symbol()); retornar;
caso 3: Alerta("Parâmetros incorretos de erro ",Símbolo()); retornar;
caso 130: Alerta("Erro no fechamento do bilhete", Símbolo()); retornar;
caso 134: Alerta("Não há dinheiro suficiente", Símbolo()); retornar;
caso 146: Alerta("O Subsistema de Comércio de Erros está ocupado", Símbolo()); retornar;
caso 129: Alerta("Error Wrong price ",Symbol()); retornar;
caso 131: Alerta("Error Incorrect volume ",Symbol()); retornar;
case 4200:Alerta("O objeto de erro já existe ",Symbol()); retornar;
padrão: Alert("Error ",err," ",Symbol());return;
}
}
//--------------------------------------------------------------------

Muito obrigado a todos que participaram da discussão!!! Em nenhum lugar sem você! :)))))

 
nemo811:

Urrrrrrra!!!!!!!! Descobrimos o erro!


Um grande obrigado a todos que participaram da discussão!!! Em nenhum lugar sem você! :)))))

você ainda tem um erro em seu código.

Lembre-se: as paradas e recebimentos de ordens pendentes não são contadas a partir do preço atual, mas a partir do preço de abertura da ordem.

 

AJUDA! Por favor me diga, se eu fechar parte de uma posição (por exemplo, pedir 1 lote, e fechar 0,5 lote) PedidoFechar bilhete deve mudar? Meu testador diz que sim... Como evitá-lo? Abaixo está um pedaço de código para fechamento...

1 2011.01.31 06:57 vender 1 2.55 1.36177 0.00000 0.00000 0.00 10000.00
2 2011.01.31 08:10 fechar 1 0.51 1.36039 0.00000 0.00000 0.00000 70.38 10070.38
3 2011.01.31 08:10 vender 2 2 2.04 1.36177 0.00000 0.00000 0.0000 10070.38
4 2011.01.31 08:10 fechar 2 0.40 1.36038 0.00000 0.00000 0.00000 55.60 10125.98
5 2011.01.31 08:10 vender 3 1.64 1.36177 0.00000 0.00000 0.00000 0.00000 10125.98

Outra pergunta: quero dividir meu pedido em 4 partes e fechar cada uma delas quando Cls_S===verdadeiro acionamento. Eu tentei usar o contador... Não funciona...

Alguém pode me dar uma idéia?

Obrigado antecipadamente!!!!

if (Tip===1 && ((Cls_S0===verdadeiro&&&TotClS==0)||(Cls_S1==verdadeiro&&&TotClS===1)
|||(Cls_S2==verdadeiro&&&TotClS===2)||(Cls_S3==verdadeiro&&TotClS====3)) // Uma ordem de venda está aberta.
{ // e há um critério para fechá-lo
Alerta ("Tentativa de fechar 0,2 Lote de Venda ",Ticket",". Aguardando resposta...");
RefreshRates(); // Refresh data
Ans=OrderClose(Ticket,LotCt,Ask,5);

se (Ans===verdadeiro) // Funcionou :)
{
TotClS++;
Alerta ("Fechado 0,2 Venda de Lote ",Ticket);
quebra; // Sair do circuito fechado
}
se (Fun_Error(GetLastError())==1) // Tratamento de erros
continuar; // Tentativa
retornar; // Sair do início()
}
quebra; // Sair enquanto

 
gince:
Eu fiz um desenho temporário do tampão de bandeira - está vazio, mas por quê? Onde está o meu erro?
Eu não sei. Sergeev sabe, ele disse que parece estar certo. Eu também gostaria de ver como escrevê-lo corretamente.
Acabei de corrigi-lo um pouco, para que mostrasse algo.
- Eu coloco o indicador em uma janela separada, então você pode colocá-lo de volta

- array macd[] estava pendurado no ar, tornou-o um indicador, aumentou a precisão
- fixou sua condição complexa para abrir, colocar uma simples para ajuste
- mudou a condição da bandeira, pelo menos ela funciona.

Então você pode introduzir gradualmente as condições, você verá imediatamente onde está o bug.

Arquivos anexados: