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 97

 
hoz:



 double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
        lastOrderOpenTime = -1;                     // Время открытия последнего ордера
O que é isso?

Tipo, hora int ou data
 
artmedia70:
Uma vez eu fiz uma função que emite mensagens para uma janela indicadora vazia. Você pode ajustar as cores das linhas apresentadas. Já está depurado. Se você precisar, eu posso compartilhá-lo.


Terei o maior prazer em ver seu código, Artem. Para testes de impressão, não é a opção mais conveniente...
 

r772ra:

 double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
        lastOrderOpenTime = -1;                     // Время открытия последнего ордера

O que é isso?


Tipo, hora int ou data

Eu reescrevi toda a bagunça e ela saiu assim:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
            lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

Por alguma razão, mesmo quando as ordens são fechadas e o último tempo de fechamento da ordem não deve ser zero.

Nós o temos no comentário o tempo todo:

Время закрытия последнего открытого ордера = 0

É por isso que meu código não funciona mais, porque esta função não funciona.

 
hoz:

Então eu reescrevi toda a bagunça e ela saiu assim:

Por alguma razão, mesmo quando as ordens são fechadas e o último tempo de fechamento da ordem deve ser correspondentemente não zero.

Eu pude obtê-lo em meu comentário o tempo todo:

É por isso que nada funciona de acordo com meu código, porque esta função não me deixa entrar.

Esta EA considera as ordens pendentes em seu código. Bem, ele examinará as ordens abertas em conformidade. Naturalmente, ele retornará a tempo zero de fechamento.

Se você quiser ver as ordens fechadas, você tem que visualizá-las na lista de ordens fechadas:

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

и

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

Mas... precisamos fazer duas funções - uma é procurar ordens abertas e a outra é procurar ordens fechadas.

 
artmedia70:

Ele também leva em conta suas ordens pendentes. E, de acordo com isso, ele procura através das ordens abertas. Naturalmente, ele retornará a tempo zero de fechamento.

Para visualizar as ordens fechadas, é necessário visualizá-las na lista das fechadas:

и

Mas... temos que fazer duas funções - uma está procurando por pedidos abertos e a outra está procurando por pedidos fechados.


Obrigado, Artyom. Exatamente... O que se segue é uma questão de otimização do código. Há perguntas sobre a estrutura do código, mas ele terá que ser escrito em uma cabeça nova.
 
hoz:

Terei o maior prazer em ver seu código, Artem. Para testar a impressão, não é a variante mais conveniente.

Aqui está um EA para testar a função. Ela contém a função em si e sua chamada. Antes de ligar, você tem que preparar uma mensagem, que pode ser de até quatro linhas. O comprimento de cada linha, se bem me lembro, não deve exceder 64 caracteres. É por isso que dividi uma mensagem em várias linhas. Cada linha de uma mensagem pode ser emitida em uma cor diferente. É um pouco claro no código - primeiro preparamos linhas de mensagem, depois chamamos a função. Não comentei muito lá - escrevi-o de uma só vez há muito tempo. Agora eu já esqueci para o que existe. Se eu tiver alguma dúvida, vou me lembrar, mas agora só me lembro das coisas necessárias.

//+------------------------------------------------------------------+
//|                                                Test iPrint().mq4 |
//|                             Copyright © 2013, Artyom A. Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, Artyom A. Trishkin"
#property link      "skype: artmedia70"
//+------------------------------------------------------------------+
//| expert variables                                                 |
//+------------------------------------------------------------------+
int            a,b,c;
string         Exp_Name, Prefix, pref,
               message1, message2, message3, message4, 
               Mass_Name_Message[10];
//+----------------------------------------------------------------------------+
int init() {
   Exp_Name=WindowExpertName(); 
   pref="_r";
   if (IsDemo()) pref="_d";
   if (IsTesting()) pref="_t";
   if (IsVisualMode()) pref="_v";
   Prefix=Exp_Name+"_"+Symbol()+pref;  
//----------------------------
   return;                                         // Выход из init() 
}
//+----------------------------------------------------------------------------+
int deinit() {
   if (!IsTesting()) {
      Comment("");
// -------- Блок удаления всех объектов, построенных на графике --------
      string Name_Del[1]; 
      int Quant_Del=0;                    
      int Quant_Objects=ObjectsTotal();   
      int LenPref=StringLen(Prefix);
      ArrayResize(Name_Del,Quant_Objects);
      for(int k=0; k<Quant_Objects; k++) {
         string Obj_Name=ObjectName(k);   
         string Head=StringSubstr(Obj_Name,0,LenPref);
         if (Head==Prefix) {                              
            Quant_Del+=1;        
            Name_Del[Quant_Del-1]=Obj_Name;
            }
        }
      for(int i=0; i<Quant_Del; i++)    
         ObjectDelete(Name_Del[i]); 
// ----- Конец блока удаления всех объектов, построенных на графике -----
      }
   return;                                // Выход из deinit()
}
//+----------------------------------------------------------------------------+
int start()
  {
//-------------------------------------------------------
// Подготавливаем первое сообщение
   message1=StringConcatenate("Первое сообщение из двух строк: Тик: ",GetTickCount()," ");
   message2=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,Digits));
   iPrint(false, message1, message2, "", "", 9, Aqua, DarkOrange);   // Выводим первое
   Sleep(3000);
//-------------------------------------------------------
// Подготавливаем второе сообщение
   b=4; c=7;
   a=b+c;
   message1=StringConcatenate("Второе сообщение из трёх строк: a=",a," ");
   message2=StringConcatenate("b=",b," ");
   message3=StringConcatenate("c=",c);
   iPrint(false, message1, message2, message3, "", 9, Aqua, LimeGreen, DarkOrange); // Выводим второе
   Sleep(3000);
//-------------------------------------------------------
// Подготавливаем третье сообщение
   message1=StringConcatenate("Третье сообщение из четырёх строк: Время: ", TimeToStr(TimeCurrent())," ");
   message2=StringConcatenate("Тик: ",GetTickCount()," ");
   message3=StringConcatenate("Время бара: ",TimeToStr(Time[0])," ");
   message4=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,Digits));
   iPrint(false, message1, message2, message3, message4, 9, Aqua, Aqua, Aqua, DarkOrange);// Выводим третье
   Sleep(3000);
//-------------------------------------------------------
   return(0);
  }
//+----------------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(bool print, string mess1, string mess2="", string mess3="", string mess4="", 
            int sz=9, color cl1=Aqua, color cl2=Aqua, color cl3=Aqua, color cl4=Aqua) {
   string   NameGrafText, message, nm;
   int      i, y, k, LenStr, shift, Win_Num=-1, num=0;
   color    cl;
   if (mess1=="") {
      Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   Win_Num=WindowFind("Win_Inform");
   if (print || 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=ObjectGet(NameGrafText, OBJPROP_YDISTANCE);               // координата Y
            ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // координата Y
            ObjectSet  (NameGrafText, OBJPROP_COLOR, DimGray);          // цвет
            }
         }
      }
   shift=num;
   int v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_Graf_Text_"+i+"_"+Symbol()+"_"+v;  // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {
         app++;
         NameGrafText=Prefix+"_Graf_Text_"+i+"_"+Symbol()+"_"+v+"_"+app;
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=cl1; break;
         case 1: message=mess2; cl=cl2; break;
         case 2: message=mess3; cl=cl3; break;
         case 3: message=mess4; cl=cl4; break;
         default:message=mess1; cl=cl1; 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();
      }
//---------------------------------      
   nm=Prefix+"_Balance_txt";
   message="Баланс :";
   cl=Yellow;
   SetText(message, cl, nm, 2, 4, 20, "Arial", 9, Win_Num);
   nm=Prefix+"_Balance";
   message=DoubleToStr(AccountBalance(),2);
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2, 70, 20, "Arial", 9, Win_Num);
//---------------------------------      
   nm=Prefix+"_Equity_txt";
   message="Средства :";
   cl=Yellow;
   SetText(message, cl, nm, 2, 4, 8, "Arial", 9, Win_Num);
   nm=Prefix+"_Equity";
   message=DoubleToStr(AccountEquity(),2);
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2, 70, 8, "Arial", 9, Win_Num);
//---------------------------------      
}
//+----------------------------------------------------------------------------+
void SetText(string Text, color cl, string nm, int angle, int x, int y, string font, int sz=0, int wnd=0) {
   if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, wnd, 0, 0);
   ObjectSet(nm, OBJPROP_CORNER   , angle);
   ObjectSet(nm, OBJPROP_XDISTANCE, x);
   ObjectSet(nm, OBJPROP_YDISTANCE, y);
   ObjectSet(nm, OBJPROP_WIDTH    , sz);
   ObjectSetText(nm, Text, sz, font, cl);
   }
//+----------------------------------------------------------------------------+

E um peru:

//+------------------------------------------------------------------+
//|                                                   Win_Inform.mq4 |
//|                                Copyright © 2012, Artyom Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Artyom Trishkin"
#property link      "skype: artmedia70"

#property indicator_separate_window
int start()
  {
  }
//+------------------------------------------------------------------+

É assim que é... Espero que você descubra.

É claro que você pode fazer um subpavimento em vez de enviá-lo para o gráfico principal, mas eu sou preguiçoso demais para fazê-lo... :)

 
artmedia70:

Aqui está um EA para testar a função. Ela contém a função em si e sua chamada. Antes de ligar, você tem que preparar uma mensagem, que pode ser de até quatro linhas. O comprimento de cada linha, se bem me lembro, não deve exceder 64 caracteres. É por isso que dividi uma mensagem em várias linhas. Cada linha de uma mensagem pode ser emitida em uma cor diferente. É um pouco claro no código - primeiro preparamos linhas de mensagem, depois chamamos a função. Não comentei muito lá - escrevi-o de uma só vez há muito tempo. Agora eu já esqueci para o que existe. Se eu tiver alguma dúvida, vou me lembrar, mas agora só me lembro das coisas necessárias.

E um peru:

É assim que é... Espero que você descubra.

É claro que você pode fazer um subpavimento ao invés de produzi-lo no gráfico principal, mas sou preguiçoso demais para fazê-lo... :)


 

Boa gente! Eu escrevi um EA, tudo parece estar funcionando bem na vida real. Mas eu o verifico no testador - há falhas. A essência é a seguinte. O Consultor Especialista deve abrir ordens por linhas horizontais desenhadas na tabela. No testador, ele as abre em vários níveis o tempo todo, como se muitas linhas tivessem sido estabelecidas, embora não haja nenhuma! Você pode explicar o que está errado?

Uma parte do código responsável pelas linhas:

int New_gorizont()

{

int tip_o_buy;

int tip_o_sell;

int obj_total=ObjectsTotal();

// se não houver novas linhas, sair

if(obj_total==0)

retornar;

// if(obj_total=ObjectsTotal(), retornar; // se houver algum...

if(obj_total!=0)

string name=ObjectName(0);

double pr=NormalizeDouble(ObjectGet(name,1),Digits);

ObjectDelete(nome); // apagar e definir novamente

if(pr>Bid+(Stop_level+1)*Ponto) // determinar o tipo de pedido

{

tip_o_sell=OP_SELLLIMIT;

tip_o_buy=OP_BUYSTOP;

}

if(pr<Bid-(Stop_level+1)*Ponto)

{

tip_o_sell=OP_SELLSTOP;

tip_o_buy=OP_BUYLIMIT;

}

// estabelecer ordens

OrderSend(Symb,tip_o_sell,Value,pr,3,pr+StopLoss*Point,pr-TakeProfit*Point, "Order set");

Prov_oshibok();

................................

}

Em outras palavras, obj_total==0 e isso é tudo o que existe. Mas, por alguma razão, tudo se define e se coloca ao infinito.

 
Olá a todos.
É normal que o registro não mostre que uma ordem pendente tenha sido acionada? Isso acontece no testador.
A conta é real.
 
Dozol:

Boa gente! Eu escrevi um EA, tudo parece estar funcionando bem na vida real, tudo é normal. Mas eu o verifico no testador e ele apresenta falhas.


Não acredito, este EA não pode funcionar nem no site real nem no testador.