[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 241

 
VOLDEMAR:

Pergunta como calcular uma série de pedidos perdidos ????

Quero saber quantos pedidos em fila fecharam em uma parada para verificar as táticas... e especialmente o último

Pessoal, eu realmente preciso disso .....


É assim que eu o calculo para mim:

Iteração = quantas vezes uma ordem seguida fechou em uma parada se uma parada em seu sentido é uma parada que dá prejuízo.

 //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }
 
Obrigado! Mas, pelo que entendi, este código encontra toda a série da história, quer tenha sido há 100 ofícios ou há 5 ....
 
VOLDEMAR:
Obrigado! Mas, pelo que entendi, este código encontra toda a série na história, independentemente de ter sido há 100 ofícios ou 5 .....

Não. A seleção do fechado mais próximo entra profundamente na história, e quando um fechado se transforma em lucro, a série é interrompida com a saída do número de negócios perdidos consecutivos = Iteração.
 

Boa tarde.

Seria esta a combinação certa?

  // заполним значениями сигнальные массивы и посчитаем их количество
  for(i=DisplayBars;i>=0;i--) 
  {

    
if (Prz0 == 0) 
       {
           f= GetBarNumWithZerroDist(i);// на этом баре пересечение
        if (f!=-1)
          {
           Price01 = iClose(Symbol_1,0,f);
           Price02 = iClose(Symbol_2,0,f);
           Prz0 = 1;
           i=f;
           }
       } 
   }
int GetBarNumWithZerroDist(int i)
{
double Smb1Cl0 = NormalizeDouble(iClose(Symbol_1,0,0),Digits);
double Smb2Cl0 = NormalizeDouble(iClose(Symbol_2,0,0),Digits2);
double Smb1Pnt = MarketInfo(Symbol_1, MODE_POINT);
double Smb2Pnt = MarketInfo(Symbol_2, MODE_POINT);
int    mBars   = MathMin(iBars(Symbol_1,0), iBars(Symbol_2,0));

    for (int f=i;f>=0;f--) 
    {
        Price1 =   NormalizeDouble(Lot*(Smb1Cl0 - iClose(Symbol_1,0,f)) / Smb1Pnt,0);
        Price2 = NormalizeDouble(K*Lot2*H*(Smb2Cl0 - iClose(Symbol_2,0,f)) / Smb2Pnt,0);
        Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)== 0) return(f);
    }
    return(-1);
}
 

Eu gostei desta:)

if(MathAbs(Spread)== 0) return(f);
 
Roger:

Eu gosto desta:)


há aqui algum erro?

Preciso devolver o valor da barra onde Spread==0,

Se não for encontrado tal valor, retornar -1.

 

Olá.

Pergunta: a OrderSend() pode devolver um valor de "0", ou menos que "-1" após a execução? Alguém já encontrou algo assim? Ou as informações fornecidas na "documentação" estão corretas:

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Função básica usada para abrir uma posição ou definir uma ordem pendente.
Devolve o número do bilhete que é atribuído ao pedido pelo servidor comercial, ou -1 em caso de falha.
P.S.: trabalhando como Telepata, procurando um erro no código de outra pessoa...
 
Eu fiz uma rede de arrasto virtual com linhas horizontais, no testador funciona bem, mas durante a otimização o testador aparentemente não funciona com essas linhas, por quê?
 
DimaMA:
Eu fiz uma rede de arrasto virtual com linhas horizontais, ela funciona bem no testador, mas durante a otimização o testador provavelmente não funciona com essas linhas, por quê? e como consertá-lo?

Por que você precisa de uma linha horizontal? Armazene o valor da linha em uma variável e você ficará feliz!!! E o Conselheiro Especialista "pensará" mais rápido! E você pode deixar a linha horizontal apenas para efeito visual.

E a razão é a seguinte: o testador trabalha com objetos gráficos somente em modo visual! Ao otimizar, não há nenhum modo visual... Embora, você possa tentar deixar o gráfico com "visual" entre parênteses após o nome de TF e par... Mas não sei se isso vai ajudar ou não. Não o verifiquei. Pensei que ajudaria, porque podemos ver as ordens que aparecem e desaparecem neste gráfico (que foi usado para testes de visualização antes) (embora o gráfico ainda não tenha sido ativado)... Talvez Alguém nos diga!

Meu conselho a você - não utilize a extração de parâmetros de objetos gráficos. Que estes parâmetros sejam armazenados em variáveis... Não torne o objeto gráfico uma variável! :))))

 
MaxZ:

Olá.

Pergunta: a OrderSend() pode devolver um valor de "0", ou menos que "-1" após a execução? Alguém já encontrou algo assim? Ou as informações fornecidas na "documentação" estão corretas:

P.S.: trabalhando como telepata, procurando por um erro no código de outra pessoa...

Hai!

Por que não? Se um pedido não for aberto devido a uma solicitação, por exemplo.

Para isso existe um loop para a abertura real de pedidos, por exemplo, como este - o número de tentativas de abertura com manipulação de erros:

int NumberOfTry = 25;
//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+

void WmOrderSend(string symbol, int cmd, double volume, double price, double stoploss, double takeprofit, string comment, int magic, datetime expiration = 0)
{
   color clr;
   datetime opentime;
   int ticket;
   int error;
  
   comment = WindowExpertName() + " " + GetNameTF(Period()) + " " + comment;
   int msl = MarketInfo(symbol, MODE_STOPLEVEL);
   clr = CLR_NONE;
   if (cmd == OP_BUY)  clr = ColorBuy;
   else if (cmd == OP_SELL)  clr = ColorSell;   
   if ((expiration > 0) && (expiration < TimeCurrent()))   expiration = 0;
  
   for (int try = 1; try <= NumberOfTry; try++)
   {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped()))      break;   
      while (!IsTradeAllowed())      Sleep(5000);
    
      RefreshRates();
      opentime = TimeCurrent();
      ticket = OrderSend(symbol, cmd, volume, price, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr);
      if (ticket > 0)
         if (UseSound)      {PlaySound("ok.wav"); break;}      
      else
      {
         error = GetLastError();
         if (error == ERR_TRADE_TIMEOUT)
         {
            Sleep(1000*66);
            if (ExistOrders(symbol, cmd, magic, opentime))
            {
               if (UseSound) {PlaySound("ok.wav"); break;}
            }
         }
        
         Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
         continue;
      }
      
      Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
      Print("Ask=", Ask, "  Bid=", Bid, "  symbol=", symbol, "  volume=", volume, "  cmd=", GetNameOP(cmd), "  price=", price, "  stoploss=", stoploss, "  takeprofit=", stoploss, "  magic=", magic);
      if ((error == ERR_COMMON_ERROR) || (error == ERR_ACCOUNT_DISABLED) || (error == ERR_INVALID_ACCOUNT) || (error == ERR_TRADE_DISABLED))
        {
         IsExpertFailed = true;
         break;
        }      
      if ((error == ERR_SERVER_BUSY) || (ERR_INVALID_TRADE_VOLUME) || (error == ERR_MARKET_CLOSED))
        {
         Sleep(1000*300); 
         break;
        }      
      if ((error == ERR_TOO_FREQUENT_REQUESTS) || (error == ERR_TOO_MANY_REQUESTS))    Sleep(1000*100);      
      if ((error == ERR_ORDER_LOCKED) || (error == ERR_LONG_POSITIONS_ONLY_ALLOWED) || (error == ERR_TRADE_TOO_MANY_ORDERS))      break;      
      if (error == ERR_TRADE_CONTEXT_BUSY) while (IsTradeContextBusy()) Sleep(1000*11);
      
      if (error == ERR_TRADE_EXPIRATION_DENIED )  {expiration = 0; continue;}      
      if ((error != ERR_PRICE_CHANGED) && (error != ERR_REQUOTE))  Sleep(1000*7.7);
   }      
}
Razão: