Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 97

 
hoz:



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

Тип, int или datetime
 
artmedia70:
Я как-то делал функцию, которая выводит сообщения в окно пустого индюкатора. Можно настраивать цвета выводимых строк. Она уже отлажена. Если вдруг, могу и поделиться.


С радостью взгляну на Ваш код Артём. Для тестирования принт, не самый удобный вариант...
 

r772ra:

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

Эт че??


Тип, int или datetime

Вот переправил всё то безобразие, и вышло так:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
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);
}

Почему-то даже когда ордера закрываются и должно быть время закрытия последнего ордера соответственно не ноль.

А в коммент выводит постоянно:

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

Поэтому и дальше у меня по коду ничего не работает соответственно, т.к. эта функция не пускает..

 
hoz:

Вот переправил всё то безобразие, и вышло так:

Почему-то даже когда ордера закрываются и должно быть время закрытия последнего ордера соответственно не ноль.

А в коммент выводит постоянно:

Поэтому и дальше у меня по коду ничего не работает соответственно, т.к. эта функция не пускает..

Он у вас и отложенные ордера учитывает. Ну и соответственно просматривает открытые ордера. Естественно, он будет возвращать нулевое время закрытия.

Чтобы просмотреть закрытые ордера, нужно просматривать в списке закрытых:

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

и

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

Но... нужно делать две функции - одна ищет открытые, другая - закрытые.

 
artmedia70:

Он у вас и отложенные ордера учитывает. Ну и соответственно просматривает открытые ордера. Естественно, он будет возвращать нулевое время закрытия.

Чтобы просмотреть закрытые ордера, нужно просматривать в списке закрытых:

и

Но... нужно делать две функции - одна ищет открытые, другая - закрытые.


Благодарю Артём. Точно... Дальше вопрос оптимизации кода. Есть вопросы по структуре кода, НО это нужно на свежую голову уже будет написать.
 
hoz:

С радостью взгляну на Ваш код Артём. Для тестирования принт, не самый удобный вариант...

Вот советник для тестирования функции. В нём, собственно, сама функция и её вызов. Перед вызовом нужно подготовить сообщение, которое может состоять максимум из четырёх строк. Длина каждой строки, если мне память не изменяет, не должна превышать 64 символа. Именно потому я и сделал разбиение одного сообщения на несколько строк. Каждую строку одного сообщения можно выводить своим цветом. Там в коде вроде как всё понятно - сначала подготавливаем строки сообщений, затем вызываем функцию. Особо там не комментировал - писал на одном дыхании, давно. Теперь уже подзабыл что там для чего. Если будут вопросы - вспомню, сейчас вспомнил только самое необходимое.

//+------------------------------------------------------------------+
//|                                                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);
   }
//+----------------------------------------------------------------------------+

Ну и индюшок:

//+------------------------------------------------------------------+
//|                                                   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()
  {
  }
//+------------------------------------------------------------------+

Вот как-то так... Надеюсь разберётесь

Можно конечно вместо вывода в окно индюка сделать подложку и выводить на основной график, но мне лень... :)

 
artmedia70:

Вот советник для тестирования функции. В нём, собственно, сама функция и её вызов. Перед вызовом нужно подготовить сообщение, которое может состоять максимум из четырёх строк. Длина каждой строки, если мне память не изменяет, не должна превышать 64 символа. Именно потому я и сделал разбиение одного сообщения на несколько строк. Каждую строку одного сообщения можно выводить своим цветом. Там в коде вроде как всё понятно - сначала подготавливаем строки сообщений, затем вызываем функцию. Особо там не комментировал - писал на одном дыхании, давно. Теперь уже подзабыл что там для чего. Если будут вопросы - вспомню, сейчас вспомнил только самое необходимое.

Ну и индюшок:

Вот как-то так... Надеюсь разберётесь

Можно конечно вместо вывода в окно индюка сделать подложку и выводить на основной график, но мне лень... :)


 

Люди добрые! Написал советник, вроде в реале все работает четко, все норм. А проверяю на тестере- глючит. Суть в следующем. Советник должен открывать ордера по брошенным на график горизонтальным линиям. И вот в тестере он их открывает бесконечно на каких попало уровнях, будто линий понаставлено куча, хотя их нет! Объясните, в чем дело?

Часть кода, отвечающего за линии:

int New_gorizont()

{

int tip_o_buy;

int tip_o_sell;

int obj_total=ObjectsTotal();

// если новых линий нет- выходим

if(obj_total==0)

return;

// если есть...

if(obj_total!=0)

string name=ObjectName(0);

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

ObjectDelete(name); // удаляем и снова выставляем

if(pr>Bid+(Stop_level+1)*Point) // определяем тип ордеров

{

tip_o_sell=OP_SELLLIMIT;

tip_o_buy=OP_BUYSTOP;

}

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

{

tip_o_sell=OP_SELLSTOP;

tip_o_buy=OP_BUYLIMIT;

}

// устанавливаем ордера

OrderSend(Symb,tip_o_sell,Value,pr,3,pr+StopLoss*Point,pr-TakeProfit*Point,"Ордер установлен");

Prov_oshibok();

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

}

То есть по идее obj_total==0, и все на этом. А он почему-то все устанавливает и устанавливает до бесконечности.

 
Привет всем.
Это нормально, что в журнале не пишетса, что сработал отложенный ордер? В тестере то это происходит.
Счёт реальный.
 
Dozol:

Люди добрые! Написал советник, вроде в реале все работает четко, все норм. А проверяю на тестере- глючит.


Не верю, не может этот советник работать ни на реале ни в тестере.
Причина обращения: