Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Pretende abrir transacções na abertura de uma vela D1? Se assim for, especificar na lógica do Consultor Especialista as condições para abrir transacções apenas num determinado momento.
E outra pergunta: estabeleço duas encomendas pendentes a +15 pips do preço: buyystop e selltop. E a cada tique, mudo-os para um novo preço. Assim que o preço lhes toca durante movimentos bruscos de preços (mais frequentemente durante eventos noticiosos), o terminal fica pendurado. (Porque é que congela?
Não posso dizer porque é que desliga, não sou psíquico, lido com o código do Conselheiro Especialista. Posso assumir que após a ordem ter sido executada, a sua EA tenta movê-la para um novo preço, mas como a ordem pendente já se encontra no mercado, a sua EA fica pendurada. Tente mostrar no registo o estado das variáveis chave do Expert Advisor para analisar a sua lógica de funcionamento.
Não posso dizer porque é que desliga, não sou psíquico, lido com o código do Conselheiro Especialista. Posso assumir que após a ordem ter sido executada, a sua EA tenta movê-la para um novo preço, mas como a ordem pendente já se encontra no mercado, a sua EA fica pendurada. Tentar mostrar no registo o estado das variáveis chave da EA para analisar a lógica do seu trabalho.
Penso ter estabelecido todas as condições correctamente:
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
Não se tem em conta que o limite de compra só pode ser fixado abaixo do preço e o limite de venda acima do preço. Para o que sugere, é necessário utilizar ordens de paragem.
Concordo, obrigado por compreender o meu algoritmo confuso. Ainda estou confuso sobre os nomes dos pingentes...
Deixe-os parar, talvez devêssemos tentar construir uma EA?
Vou testá-lo mais tarde e mostrar o que acontece ?
... Ou dê-me uma ligação a um, não é como se eu tivesse descoberto a América?
Penso ter definido correctamente todas as condições de teste:
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
Receio não o poder ajudar porque o seu código não se presta a análises. Talvez possa acrescentar alguns comentários para melhorar a sua compreensão do mesmo. Não é claro para que é utilizada a matriz ord[] e para que dados é armazenada. Compreendi o seu código desta forma: cada tick que escreve o tipo de ordem na matriz (Uchet_Orderov_Function(Symbol(),Magic,ord);) depois verificar a condição se(ord[7]==2 && ord[6]==0 && Volume[0]==1) e se for verdade, as ordens pendentes serão eliminadas e todas as posições serão encerradas. Depois verificamos a condição se (ord[6]==0 && ord[7]==0 && Volume[0]===1) e se é verdade, duas ordens pendentes são abertas. Mas o valor da matriz ord[] não será actualizado antes de verificar a condição se (ord[6]==0 && ord[7]==0 && Volume[0]==1). E será actualizado apenas no segundo tick.
Por isso, é necessário registar todos os valores da matriz ord[] que afectam a sua lógica.
Note também este fragmento de código:
Penso que faltam os parênteses de software { . Deveria ser assim:
Note também este pedaço de código:
Penso que lhe faltam parênteses { . É suposto ser assim:
Neste caso, os parênteses não afectam a operação (lógica). Não há erro
Neste caso, os parênteses não têm qualquer efeito sobre a operação (lógica). Não há erro.
Concordo, obrigado por compreender o meu algoritmo confuso. Ainda estou confuso sobre os nomes dos pingentes...
Deixe-os parar, talvez devêssemos tentar construir uma EA?
Vou testá-lo mais tarde e mostrar o que acontece ?
... Ou dê-me uma ligação a um, não é como se eu tivesse descoberto a América?
É preciso ter pelo menos conhecimentos básicos para sugerir algo. Todas as ideias simples foram experimentadas durante muito tempo e, de facto, não se descobriu a América. Mas é provável que ninguém procure uma ligação para si em fóruns e kodobase. Se precisar, procure-o. Ou acha que há pessoas que mantêm na sua mente ligações a todo o tipo de Conselheiros Especialistas, guiões e indicadores?
(Tenho uma ideia, preciso de ajuda)) Escreva um Conselheiro Especialista para isto
Estou a usá-lo para comércio durante muito tempo. Recebo 1000 pips mensais num par de moedas. Nuncaestive habituado a tal tipo de comércio. Não há praticamente nenhum levantamento de crédito, máximo 5 pips.
Calendário H4
1. MA4/simples\\\\\\i1
2. MA5/simples/aberto
O princípio de trabalho deve ser o seguinteSem Lucros e Stop Loss. Abrir e fechar comércios apenas em crossovers. Por exemplo, atravessar de baixo para cima abriu uma ordem para cima e fechar a ordem apenas quando esta é atravessada para trás. Se houver um sinal inverso para fechar a ordem de compra, abrir a ordem de venda. Geralmente, espero que compreendam) na estratégia não é sequer o lucro que importa, mas estes malditos "crossovers") Algo como isto) O comércio desta estratégia durante muito tempo, o lucro é bom, mas uma vez que penso que escrever este consultor especialista em estratégia não será difícil.
Se concordar em ajudar aqui é o meu MAIL: 4iterRrock@mail.ru
Abaixo está o meu padrão que tenho vindo a negociar há quase um ano.