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 759

 
Kapizdo4ka:

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

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?

O erro é que o preço raramente coincide exatamente com o valor do nível. Ou preço >= H3 ou definir uma faixa de erro.
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double gPoint=0.001;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if(OrdersTotal()==0)
     {
      Print(" Открытие первой позиции ");
      double _Ask=MarketInfo("GBPUSD",MODE_ASK);
      int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0)
        {
         Print(" ОРДЕР ОТКРЫТ ",ticket);
        }
     }

   double _Bid=MarketInfo("GBPUSD",MODE_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
        {
         if(OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid,15);
            
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

           }
        }
     }
   return(0);
  }

Bom dia.

O programa tem este aspecto.

Ao compilá-lo, ele dá para fora:

Ozero.mq4'.Ozero.mq4 1 1
valor de retorno de "OrderClose" deve ser verificado Ozero.mq4 46 13
conversão implícita de 'número' para 'string' Ozero.mq4 49 117
0 erro(s), 2 advertência(ões) 1 3


A aba "resultados" mostra que os pedidos estão abrindo e fechando.

1 2014.08.25 00:00 comprar 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 fechar 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 comprar 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 fechar 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 comprar 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 fechar 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 comprar 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 fechar na parada 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - Interrompi o trabalho, fechando o testador.


A seguir, olhamos para o "Jornal":

2014.10.31 07:46:44.837 GBPUSD,M15: 4453 tick events (5608 bars, 340128 bar states) processados dentro de 312876 ms (tempo total 324436 ms)
2014.10.31 07:46:44.837 2014.08.26 13:13 Testador: o pedido nº 4 está encerrado
2014.10.31 07:46:44.798 2014.08.26 13:13 O testador visual parou
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ENCOMENDA ABERTA 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: abrir #4 comprar 0.10 GBPUSD a 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Aberto #4 comprar 0.10 GBPUSD a 1.6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Não creio que tenha fechado. Aqui vamos nós: 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: bilhete desconhecido 3 para a função OrderClose
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: fechar #3 comprar 0,10 GBPUSD a 1,6576 ao preço 1,6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: abrir #3 comprar 0,10 GBPUSD a 1,6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: Posição aberta #1
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: O que está acontecendo? Aqui vamos nós: 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: bilhete desconhecido 2 para a função OrderClose
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: fechar #2 comprar 0,10 GBPUSD a 1,6564 ao preço 1,6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: abrir #2 comprar 0.10 GBPUSD a 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: Abertura da primeira posição
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: O que está acontecendo? Aqui vamos nós: 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: bilhete desconhecido 1 para a função OrderClose
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: fechar #1 comprar 0,10 GBPUSD a 1,6550 ao preço 1,6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: PEDIDO ABERTO 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: abrir #1 comprar 0.10 GBPUSD a 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: abrir #1 comprar 0.10 GBPUSD a 1.6550 ok
2014.10.31 07:41:31.958 Entradas Ozero: gLot=0,1; gPoint=0,001;

Agora estou completamente perdido. Por um lado, as ordens estão sendo fechadas como você pode ver no gráfico e nos resultados, por outro lado o código está sendo executado com erros como visto no log: (((((((((((

Ozero.

 
Você está tentando fechar a mesma ordem duas vezes. Retire a parte superior.
 
Roger:
Você está tentando fechar a mesma ordem duas vezes. Retire a parte superior.
De preferência, a inferior. A ordem tem que ser selecionada com antecedência.
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

Bom dia.

Eliminadas duas linhas. Tudo funciona. E tudo é exibido corretamente no gráfico, nos resultados e nos registros.

Pergunta: ao compilar, ele dá


"Ozero".mq4'.Ozero.mq4 1 1
Valor de retorno de "OrderClose" deve ser verificado Ozero.mq4 46 13
0 erro(s), 1 aviso(s) 1 2



Sobre o que o compilador me avisa? A 46a linha é OrderClose(OrderTicket(),OrderLots(),_Bid,15);


Ozero.

 
tuner:

Vocês podem me dizer o que pode estar causando a falha que ocorreu hoje?

A EA tem a opção de interromper as negociações 15 minutos antes do fechamento do mercado na sexta-feira.

Quando um novo dia aparece a EA verifica se é sexta-feira, então hoje deixamos de negociar em StringToTime("23:59")-15*60

No testador de estratégia, esta função funciona corretamente. No entanto, na negociação real, vejo uma situação totalmente diferente - o Expert Advisor deixa de negociar no primeiro tick quando chega a sexta-feira.

Aqui estão as impressões da revista do Expert Advisor:

Corretor nº 1, demonstração:

0 05:59:47.731 Scalper GBPAUDpt,M1: Terminar Na sexta-feira = 2014.10.23 23:44:00

Corretor 2, real:

0 03:00:11.999 Escalpador EURUSD,M1: Terminar Na sexta-feira = 2014.10.23 23:44:00

Ou seja, quando o bar diário de hoje aparece (sexta-feira, 24 de outubro) no primeiro tick, o EA

converterá a linha "23:59" para a hora de ontem, em vez de atribuir o dia de hoje.

Entretanto, se o Expert Advisor for reiniciado na sexta-feira no meio do dia, ele determinará corretamente a hora de conclusão.

Encontrei a razão deste problema: https://forum.mql4.com/33023

Como esperado, é praticamente um bug na função StringToTime. Todos os sintomas são semelhantes. Esta função converte a string "23:59" para data com data do PC local, mas não com data do MT4. E no testador, como sabemos, a data do PC local é emulada e equiparada à hora do terminal. É por isso que tudo funciona corretamente no testador, mas o tempo de demonstração/real resulta em falhas e perdas. A documentação, é claro, não diz de onde vem a data e o link acima mostra que este problema foi relatado há 4 anos, mas aparentemente as metáforas não se importam.

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD",MODE_BID);

      if (_Bid>=gPoint1)
        {
           for(pos=OrdersTotal();pos>=0;pos--)
             {
                OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
             }      
       
        }

Outra pergunta. Entendo corretamente isso:

1. A numeração do pedido começa a partir de "0".

2) Este código fechará absolutamente todas as ordens, independentemente de eu as abrir manualmente ou programadamente... Ou seja, nunca vamos encontrar uma ordem que esta parte do programa não possa fechar?


Ozero.

 

Alguém já fez a rolagem do texto na tela? Por exemplo - pedidos mais ou menos abertos/fechados/modificados, etc... Notícias mais ou menos... ?

Se você não se importa, por favor, mostre-me um pedaço de código.

Obrigado!

 
Vinin:
A mais baixa é melhor. A ordem deve ser escolhida de antemão.

É melhor assim:

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

Alguém já fez a rolagem do texto na tela? Por exemplo - pedidos mais ou menos abertos/fechados/modificados, etc... Notícias mais ou menos... ?

Se você não se importa, por favor, mostre-me um pedaço de código.

Senx!

Estava fazendo rolagem vertical na janela indicadora vazia. Aqui está a função:

//+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(string mess1, int sz=9, color color1=clrDarkGray, 
            string mess2="", color color2=clrDarkGray, 
            string mess3="", color color3=clrDarkGray, 
            string mess4="", color color4=clrDarkGray, 
            bool draws=true) {
   string   NameGrafText, message, nm;
   int      i, y, k, shift, Win_Num=-1, num=0;
   color    cl;
   Win_Num=WindowFind("Win_Inform");
   if (mess1=="") {
      //Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   if (!draws || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0) {
         if (ObjectFind(NameGrafText)==Win_Num) {
            if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete(NameGrafText);  
               Mass_Name_Message[i]="";
               }
            else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE);          // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR, clrDimGray);       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v);   // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {  // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: message=mess4; cl=color4; break;
         default:message=mess1; cl=color1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

Como exemplo de utilização de uma única mensagem colorida (você pode ter 4 cores em uma linha para palavras diferentes):

if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
   string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
   iPrint(mess1,9,clrBlue);
   trade.OpenS(sy,lots,mn,0.0,0.0,co);
   }

Deve haver um indicador vazio chamado Win_Inform no gráfico.

Razão: