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 758

 
Ozero:

Passe o ";" atrás do suporte.

O programa funciona, MAS ocasionalmente falha com erro 4108.


Ozero.

Abrir ajuda, ver erros de tempo de execução, e nós vemos:

4108

ERR_INVALID_TICKET

Número de bilhete incorreto.

Pense e procure...

 

Ajudar as pessoas a negociar em cada moeda com suas próprias ordens para distinguir e diferenciar + após a ordem aberta se o preço voltar ainda mais longe poderia abrir outra ordem igual à primeira.

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
 
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt=0, ticket, total;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // проверяем TakeProfit
     }
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
 
   total=OrdersTotal();
   if(total<1) 
     {
      // нет ни одного открытого ордера
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // проверяем на возможность встать в длинную позицию (BUY)
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
                          "macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // проверяем на возможность встать в короткую позицию (SELL)
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
                          "macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // переходим к важной части эксперта - контролю открытых позиций
   // 'важно правильно войти в рынок, но выйти - еще важнее...'
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
                 return(0); // выходим
                }
            // проверим - может можно/нужно уже трейлинг стоп ставить?
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
                                 OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }
            // проверим - может можно/нужно уже трейлинг стоп ставить?
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
                                 OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// конец.
 

Olá a todos!

Acabo de notar que o NormalizeDouble funciona de forma estranha.

Ou seja, o Expert Advisor trabalha bem e não tem erros, mas os logs no Strategy Tester são muito estranhos.

Vou explicar.

Eu calculo o lucro usando esta função. Eu faço o que acho que o NormalizeDouble(Lucro,Dígitos) deve fazer;

Então Imprimo(" lucro=",DoubleToStrMorePrecision(Profit,8));

Como resultado, o registro mostra o seguinte: "lucro=0,88881912". Parece ser 0,88881000, certo?

Ou talvez eu seja estúpido e faça algo errado?

 
goodearth:

Olá a todos!

Acabo de notar que o NormalizeDouble funciona de forma estranha.

Ou seja, o Expert Advisor trabalha bem e não tem erros, mas os logs no Strategy Tester são muito estranhos.

Vou explicar.

Eu calculo o lucro usando esta função. Eu faço o que acho que o NormalizeDouble(Lucro,Dígitos) deve fazer;

Então Imprimo(" lucro=",DoubleToStrMorePrecision(Profit,8));

Como resultado, o registro mostra a seguinte mensagem: "lucro=0,88881912". Parece ser 0,88881000, certo?

Ou talvez eu seja estúpido e faça algo errado?

Você tem um valor de lucro em ordens comerciais?
 
artmedia70:
Seu valor de lucro participa de ordens comerciais?

Sim, é claro. E sem erros :-). Foi por isso que fiquei surpreso.

Eu tenho o Build 735.

O comércio está em demonstração.

Aaaaaaaaaaaah Eu peguei! Esqueci a operação de atribuição:-). "Profit=NormalizeDouble(Profit,Digits)".

Mas eu ainda não entendo porque a EA não mostra erros ))

Talvez o servidor arredonde automaticamente.....

Eu pensei que NormalizeDouble é um procedimento, não uma função :-).

 
Ozero:

Coloque ";" atrás de um parêntese.

O programa funciona, MAS ocasionalmente falha com erro 4108.


Ozero.

De fato, ele precisa ser apagado!

 
borilunad:

Na verdade, ela deve ser apagada!

Boris, é melhor mostrar-lhe o código diretamente, porque eu estava com sono demais para me lembrar... ;)

ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());
 
artmedia70:

Boris, é melhor mostrar-lhe o código diretamente, porque eu estava com sono demais para me lembrar... ;)

Não quis abusar de seus direitos autorais! ;)

E sério, algo não colou! Mas eu vou tentar agora!

ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("");

E agora funcionou! Isso é estranho!

 
Olá

Por favor, me dê uma solução.

Há uma EA que compila sem erros com a 500ª construção do editor.

Mas na nova versão gera erros. Eu vejo estes erros:

bool TP?=true;   // ошибка  '?' - semicolon expected    
E este aqui duas vezes.

if(TP?)    // ')' - unexpected token    
           // ')' - ':' colon sign expected     
Procurei no manual a nova versão e a antiga, mas não encontrei nada sobre o ponto de interrogação.

Pergunta: o que significam estas operações e como corrigi-las para que o código seja compilado normalmente?

Obrigado de antemão.


 

Olá! Você poderia me dizer por que às vezes tenho um operador ifle que não funciona.
Aqui está um exemplo:

double H3=ObjectGet ("H3 line", OBJPROP_PRICE1);
int start()
{
double price = Bid;
if (price==H3)
{
 Alert ("Урааааа  ", Symbol());
}
return(0);
}

Onde:
H3 é o valor do preço do nível
preço é o preço atual

O resultado é que o preço atinge este nível (às vezes até pára nele), mas Alert não aciona.
Você pode me dizer qual é o erro?