Olá. Os especialistas em programação podem ajudar.
Expert Advisor: Compra - cruzamento de estocásticos e o sinal na área sobre-vendida (abaixo de 25), sob a condição de que
O pivô está abaixo do nível de preço (uma espécie de suporte); pelo contrário, o pivô está acima do nível de preço.
Os testes têm mostrado algumas falhas de programação. 1) Como abrir apenas uma negociação por sinal (durante os testes eu perdi tudo, quando o sinal ainda está ativo (falso), e a condição de fechamento de posição já ocorreu). 2) se defini corretamente a condição de que o Pivot está acima / abaixo do nível de preço. Tenho dúvidas, olhando o gráfico de testes.
Se eu puder ajudar com exemplos específicos. Eu sei como fazer programação em nível de simples compilação!!!!!!!
Lotes duplos externos = 0,1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
duplo P_up0,P_down0,P_up1,P_down1;
duplo st_m1,st_s1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, bilhete, total;
if(Bars<100)
{
Impressão ("barras com menos de 100");
retorno(0);
}
P_up0=iCustom(0,0, "Canal de preços",11,0,0);
P_down0=iCustom(0,0, "Price channel",11,1,0);
P_up1=iCustom(0,0, "Canal de preços",11,0,1);
P_down1=iCustom(0,0, "Canal de preços",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//definir todos os dados
total=OrdensTotal();
if(total<1)
{
// Verifique a margem livre
if(AccountFreeMargin()<(1000*Lots))
{
Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin();
retorno(0);
}
// condição de abertura da posição de COMPRA
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,0,",0,0,0,Green);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido aberto : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError()));
retorno(0);
}
// condição de posição de venda aberta
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,0,Red);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido de venda aberto : ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError()));
retorno(0);
}
retorno(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posição longa aberta
{
// condição de fechamento de posição longa
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
retorno(0);
}
}
senão
{
// condição de fechamento de posição curta
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
retorno(0);
}
}
}
}
retorno(0);
}
1) como fazer apenas um negócio aberto a um sinal
Eu preciso assim:
if(total<1) { if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Alert("Покупка: ",OrderOpenPrice()); } else Alert("ошибка:по цене ",OrderOpenPrice()); return(0); } return(0); }
Ainda não entendo o que mudei neste código. parece ser o mesmo!
E ainda assim, como posso programá-lo para abrir apenas uma posição por sinal?
E se uma posição foi fechada na mesma barra (ou seja, o sinal ainda está ativo), então uma nova não deve ser aberta.
...Entretanto, como posso programá-lo para abrir apenas uma posição por sinal?
E se uma posição na mesma barra foi fechada (ou seja, o sinal ainda está ativo), então uma nova posição não deve ser aberta.
Se o horário de abertura dos pedidos, incluindo os fechados, pertence ao bar atual (no qual o sinal apareceu), então estamos fumando na cerca.
Aproximadamente assim:
bool flag=true; int cnt=OrdersTotal()-1; for(int i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } cnt=OrdersHistoryTotal()-1; for(i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } if(!flag) return;
Como pode haver mais de 1 posição aberta de cada vez se esta estiver presente:
total=OrdersTotal();
if(total<1)
Inseriu seu código no EA. mas o resultado é o mesmo.
Eu devo ter inserido a moldura errado. por favor, olhe para ela.
Lotes duplos externos = 0.1;
bool flag=true;
//+
+
//|
//+
+
int start() { double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
int cnt, ticket, total;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
P_up0=iCustom(0,0, "Price channel"11,0,0);
P_down0=iCustom(0,0, "Price channel",11,1,0);
P_up1=iCustom(0,0, "Price channel"11,0,1);
P_down1=iCustom(0,0, "Price channel",11,1,1);
st_m1=iStochastic(0,0,10,3,3,3,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0, "Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//set all data
total=OrdensTotal();
if(total<1)
{
// Verificar margem livre
if(AccountFreeMargin()<(1000*Lots))
{
Imprimir("Nós não temos dinheiro. Free Margin = ", AccountFreeMargin());
return(0);
}
// Condição de abertura da posição COMPRAR
if(st_m2>st_s2&st_m1>st_s1&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alerta("Compra: ",OrderOpenPrice());
}
else Alerta("erro:preço ",OrderOpenPrice());
return(0);
}
int cn=OrdersTotal()-1;
for(int i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderOpenTime()>=Time[0]) { // Tempo[0] - se a posição abre na barra zero do símbolo atual
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continua;
if(OrderOpenTime()>=Time[0]) { // Tempo[0] - se a posição for aberta na barra zero do símbolo atual
flag=false;
break;
}
}
if(!bandeira) retorno;
// Condição de abertura da posição de VENDA
if(st_m2<st_s2&st_m1<st_s1&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,0,",0",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alerta("Compra: ",OrderOpenPrice());
}
else Alerta("erro:preço ",OrderOpenPrice());
return(0);
}
int c=OrdersTotal()-1;
for(int a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderOpenTime()>=Time[0]) { // Tempo[0] - se a posição abre na barra zero do símbolo atual
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continua;
if(OrderOpenTime()>=Time[0]) { // Tempo[0] - se a posição abre na barra zero do símbolo atual
flag=false;
break;
}
}
if(!flag) return;
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELLL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posição longa aberta
{
// condição para fechar posição longa
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)
return(0);
}
}
}
else
{ // short position close condition
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}
Como pode haver mais de uma posição aberta ao mesmo tempo, se esta estiver presente:
total=OrdersTotal();
if(total<1)
Você entendeu mal. não mais de 1 posição é aberta simultaneamente!!!!!!! sinal apareceu - posição aberta. no mesmo preço de barra zero foi na direção oposta e a condição de fechamento da posição é válida. ela é fechada, de acordo, na mesma barra zero. Mas a ação do sinal não foi cancelada. a posição abre e fecha novamente, pois vai na direção oposta.
Então a questão é como fazer um sinal para abrir apenas uma posição, mesmo que ela feche com um novo tique!?
Inseriu seu código no EA. mas o resultado é o mesmo.
Eu devo ter inserido o código incorretamente.
Por favor, mas da próxima vez cole o código através do botão
Não deve haver erros, mas eu não o testei.
extern double Lots = 0.1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double P_up0,P_down0,P_up1,P_down1; double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1; int i, cnt, ticket, total; bool flag=true; if(Bars<100) { Print("bars less than 100"); return(0); } // Проверяем стоит ли открываться cnt=OrdersHistoryTotal()-1; for(i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } cnt=OrdersTotal()-1; for(i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } if(!flag) return(0); //----------------------------------------------- P_up0=iCustom(0,0,"Ценовой канал",11,0,0); P_down0=iCustom(0,0,"Ценовой канал",11,1,0); P_up1=iCustom(0,0,"Ценовой канал",11,0,1); P_down1=iCustom(0,0,"Ценовой канал",11,1,1); st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1); st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1); st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2); st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2); Pivot=iCustom(0,0,"Pivot",0,1); ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1); //задали все данные // Проверка свободной маржи if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Условие открытие позиции BUY if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Alert("Покупка: ",OrderOpenPrice()); } else Alert("ошибка:по цене ",OrderOpenPrice()); return(0); } // Условие открытие позиции SELL if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Alert("Покупка: ",OrderOpenPrice()); } else Alert("ошибка:по цене ",OrderOpenPrice()); return(0); } for(i=cnt;i>=0;i--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) {// длинная позиция открыта // условие закрытие длинной позиции if(P_down1>P_down0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } } else { // условие закрытия короткой позиции if(P_up1<P_up0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } } } } return(0); }
O estranho agora é que o Expert Advisor não está trabalhando com o fechamento das posições. pode haver várias posições do mesmo tipo abertas e ativas ao mesmo tempo. E o resultado: tudo está perdendo com o mesmo problema, embora em uma versão modificada!
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Olá. Os especialistas em programação podem ajudar.
Expert Advisor: Compra - cruzamento de estocásticos e o sinal na área sobre-vendida (abaixo de 25), sob a condição de que
O pivô está abaixo do nível de preço (uma espécie de suporte); pelo contrário, o pivô está acima do nível de preço.
Os testes têm mostrado algumas falhas de programação. 1) Como abrir apenas uma negociação por sinal (durante os testes eu perdi tudo, quando o sinal ainda está ativo (falso), e a condição de fechamento de posição já ocorreu). 2) se defini corretamente a condição de que o Pivot está acima / abaixo do nível de preço. Tenho dúvidas, olhando o gráfico de testes.
Se eu puder ajudar com exemplos específicos. Conheço programação em nível de simples compilação !!!!!!!.
Lotes duplos externos = 0,1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
duplo P_up0,P_down0,P_up1,P_down1;
duplo st_m1,st_s1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, bilhete, total;
if(Bars<100)
{
Impressão ("barras com menos de 100");
retorno(0);
}
P_up0=iCustom(0,0, "Canal de preços",11,0,0);
P_down0=iCustom(0,0, "Price channel",11,1,0);
P_up1=iCustom(0,0, "Canal de preços",11,0,1);
P_down1=iCustom(0,0, "Canal de preços",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//definir todos os dados
total=OrdensTotal();
if(total<1)
{
// Verifique a margem livre
if(AccountFreeMargin()<(1000*Lots))
{
Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin();
retorno(0);
}
// condição de abertura da posição de COMPRA
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,0,",0,0,0,Green);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido aberto : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError()));
retorno(0);
}
// condição de posição de venda aberta
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,0,Red);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido de venda aberto : ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError()));
retorno(0);
}
retorno(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posição longa aberta
{
// condição de fechamento de posição longa
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
retorno(0);
}
}
senão
{
// condição de fechamento de posição curta
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
retorno(0);
}
}
}
}
retorno(0);
}