Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 210

 

Boa tarde.

Minha estratégia leva em conta o spread, o spread é definido por uma função:

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

Mas como a propagação é constante no testador de estratégia, eu preciso de um emulador de propagação aleatória. Quero emular as mudanças de spread no testador na faixa de 2 a 3 pontos (4 dígitos) em 80% dos casos e mais de 3 pontos em 20% dos casos. Quaisquer idéias de como implementar isto, ou links onde tal idéia tenha sido resolvida.

 
artmedia70:


O erro com o mágico faz com que sua EA não veja que sua posição é fechada em uma parada quando ela fecha em uma parada. Por quê? A resposta é que você abre uma posição com Magic 123 e envia a variável Magic para a função que verifica o fechamento da posição na parada. O que você acha que é igual quando inicializado implicitamente? Zero. A função é naturalmente procurar posições com o número mágico 0 e é igual a 123 em suas posições. E nós não estamos discutindo, apenas... ...raciocínio... Verifique a reação de fechamento na parada:


Eu não olhei para o resto de sua lógica EA "morta" - eu estava ajudando você a descobrir a função stop close check...


Artem ! Bom dia! Mais uma vez obrigado pela ajuda.

Removi toda a lógica "morta" desnecessária e "ressuscitei" os restantes.... tanto quanto eu entendo.

Deixou apenas uma função, que você me ajudou a corrigir.

Mas os milagres começaram a acontecer além da minha compreensão.

1. Meu consultor especializado abre as negociações no início de cada vela (eu tenho uma vela de 5 minutos)

e ignorando todas as condições.

Isto é, o controle entra na primeira linha

double Price=iOpen(Symbol (),0,0);

E então ele salta por 11 linhas e chega às seguintes linhas

Lote=0,1;

OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123 );

2. se removermos a linha que calcula o lote mínimo Lote=MarketInfo(Symbol(), MODE_MINLOT);

O Expert Advisor funciona bem, mas a função isCloseLastPosByStop não funciona.

Eu estive exercitando meu cérebro por muito tempo....., mas em vão. Eu ficaria grato se você pudesse me dizer onde o erro está escondido.

double   Lot = 0.1;                                          //я проинициализировал переменную
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);                      //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();                                   //запоминаем количество всех открытых ордеров
      if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)      //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)       //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))  //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);                  //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else                                                    //в противном случае(если функция на вернула ??????
                     {
                     Lot=0.1;                                             // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                      
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

solnce600:

Артем ! Добрый день! Еще раз спасибо за помощь.

Toda minha "lógica morta" removeu o desnecessário e "ressuscitou" o resto.... tanto quanto eu entendo.

Eu praticamente deixei apenas a função, o que você me ajudou a corrigir.

Mas os milagres, que estão além do meu entendimento, começaram a acontecer.

Depois de

 if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))

acrescentar tudo ao corpo { }

Desculpe, não sou Artem.

 
ALXIMIKS:

solnce600:

Depois de

acrescentar tudo ao corpo { }

Sinto muito, não sou Artem.

Obrigado .Perdoe-me pela primeira vez.......(Não sei como adicionar o emoticon brincalhão)
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

t ou Lote ????

 
ALXIMIKS:

solnce600:

Depois de

acrescentar tudo ao corpo { }

Desculpe, não sou Artem.

Fez como você disse..... alas advisor trabalha .... a função isCloseLastPosByStop não funciona

double   Lot=0.1;
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);  //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();               //запоминаем количество всех открытых ордеров
      if ((ot==0)                      //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
               
                {
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);            //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                            //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else  //в противном случае(если функция на вернула??????
                     {
                     Lot=0.1; // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                     } 
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

Este é um código da função bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

Mas e se houver um deslize em 3 pips? Não está muito bem pensado ))

 if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
 
solnce600:

Você entende - Ainda não estou realmente incomodado com isso....

Há uma semana venho tentando descobrir porque esta função não funciona para mim.

Isto é, preciso que o próximo pedido abra com um volume duplo do pedido fechado na parada, e o próximo pedido abra com um volume regular após a parada sem parar.


Corrija a lógica do trabalho, caso contrário, levará muito tempo para pensar
 
ALXIMIKS:

Este é um código da função bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

Mas e se houver um deslize em 3 pips? Não está muito bem pensado ))


Você entende - Ainda não estou me incomodando com isso....

Há uma semana venho tentando entender porque esta função não funciona da maneira que eu quero.

Isto é, preciso abrir a próxima ordem após a parada com um volume duplo da ordem que fechou na parada, e após a sem parar, a próxima ordem é aberta com um volume regular.
 

E por que tocar a história do pedido? Olhe para o equilíbrio - onde ele foi nessa direção e mude o lote.

Se for apenas um robô que irá negociar por sua conta.