Pergunta para os conhecedores

 

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);
}




Arquivos anexados:
pivot.mq4  2 kb
 
Kostay:

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);
     }
 
Perdi todo o meu depósito no mesmo local!
 

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.

 
Kostay:

...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);
}




 
D500_Rised:

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!?

 
Então você precisa fazer uma proibição do comércio intrabarco passar pela busca com estas palavras-chave, você a encontrará.
 
Kostay:

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!

Razão: