Скрипты: History_Draw

 

History_Draw:

2 Скрипта для анализа результатов торгов. Полезны как инвесторам так и трейдерам.

Author: Владимир Тезис

 
Здравствуйте, мне понравился Ваш вариант графического отображения торгов на графике. Давно ищу такого рода скрипт для удобной работы с историей сделок.
Возможно ли, сделать отображение на графике открытия и закрытия так же отложенных ордеров, что бы возможность работать с историей торгов была полной?
 
Не понял, что Вы имеете ввиду. Например, ставим отложенный ордер по евробаксу, ставим в лонг по цене 1,3500. Как только он сработает,  так сразу он станет рыночным ордером, открытым по указанной цене.  Что значит открытие и закрытие отложенных ордеров?
 
Многие используют в работе отложенные ордера согласно своим системам, и было бы удобно сразу видеть, что позиция открыта именно из отложенного ордера, и к какому результату это привело в конкретной ситуации. Есть так же отложенные ордера, которые закрываются вручную. Таким образом, отображение отложенных ордеров сделает визуальный анализ истории торгов более эффективным.
Я вставил рисунок как, например, это могло бы быть, извините я не разбираюсь в программировании и не знаю, возможно ли это реализовать в коде скрипта. Может даже можно сделать стоповые и лимитные ордера разными значками?
 
В силу того, что отложенный ордер, который сработал и был закрыт, в истории торгов не имеет признака, по которому можно было бы определить, что это сработал ОТЛОЖЕННЫЙ ордер, то извлечь историю жизни отложенного ордера не представляется возможным. Можно создать советника, который будет мониторить ордера, писать историю в файл и ставить там пометки об отложенных ордерах. Тогда наверно можно было бы написать скрипт, который будет рисовать историю торгов из этого файла. Но выходит, что мы должны накапливать такую историю. Может кто и захочет подобное осуществить в коде, у меня же заниматься этим желания нет.
 
Понятно, я то не очень в кодах разбираюсь. Просто все скрипты, что встречались, дают возможность частично работать с историческими данными или графически неудобно сделаны. Вот, например, попробуйте проанализировать свои действия по депозиту, который уже закрыт и от него остался только файл Statement.htm, берете и в ручную ставите значки открытия и закрытия позиций на графике, на компьютере, грустно и куча времени уходит. Может можно хотя бы сделать еще один файл в этот комплект который бы выводил историю из файла отчета (Statement.htm) на график? А на чем еще учиться как не на анализе собственных действий по истории, в различных ситуациях на рынке? 
Вот то что, попадалось мне по этой тематике, может окажется полезным:
http://codebase.mql4.com/ru/code/9634
http://codebase.mql4.com/ru/code/8099
 
Я такой скрипт уже где-то видел. Возможно что на этом сайте. Попробуйте поискать в базе скриптов.
 
Ага, вот он
http://codebase.mql4.com/ru/code/11194
Скрипт ExAccount берет данные по ордерам из файла отчета StrategyTester. htm и отмечает места открытия закрытия и модифицирования позиций на графике. Использование скрипта удобно, если хочется наглядно посмотреть, в каких моментах тот или иной эксперт открывал позиции, а ничего кроме файла отчета нет.
 

По подсказке уважаемого granit77 оформил эти два скрипта как функции, которые можно использовать в советнике/индикаторе. Вот пример использования кода (сорри, сегодня на рынке выходной - не могу оттестировать на реальных торгах - ежли чё - пишите):

// ================================================================================================+
//                 =====              HistoryDraw.mq4                      =====                   |
//             =============          Copyright © 2012, Drknn          =============               |
//                 =====              mailto: drknn@mail.ru                =====                   |
// ================================================================================================+
#property copyright "Copyright © 2012, Drknn"
#property link      "drknn@mail.ru"
string          NameExpert="HistoryDraw.mq4";
extern bool     UseCreateHistoryDraw=true;// добро отрисовывать историю торгов при работе советника
extern bool     UseDelHistoryDraw=true;/* добро удалять отрисованную историю торгов при деинициализации
                                         советника. Если переменная UseCreateHistoryDraw имеет значение
                                         false, то безразлично, какое значение принимает перемнная UseDelHistoryDraw
                                       */
                                                                                                                                                
int    myBars;
// ================================================================================================+
// ================================================================================================|
//             =============          ИНИЦИАЛИЗАЦИЯ СОВЕТНИКА          =============               |
// ================================================================================================|
// ================================================================================================+
int init(){
        Print("Советник ",NameExpert," на инструменте ",Symbol()," проинициализирован - включен в работу");
        return(0);
}
// ================================================================================================+
// ================================================================================================|
//            =============         ДЕИНИЦИАЛИЗАЦИЯ СОВЕТНИКА         =============                |
// ================================================================================================|
// ================================================================================================+
int deinit(){
        
        if(!IsTesting()){
                string s_Deint;
                switch(UninitializeReason()){
                        case 0:         s_Deint="советник самостоятельно завершил свою работу"; break;
                        case 1:         s_Deint="советник удалён с графика либо вручную, либо на график был брошен другой эксперт, что привело к удалению данного"; break;
                        case 2:         s_Deint="советник перекомпилирован"; break;
                        case 3:         s_Deint="символ или период графика был изменен"; break;
                        case 4:         s_Deint="график закрыт"; break;
                        case 5:         s_Deint="входные параметры были изменены пользователем"; break;
                        case 6:         s_Deint="активирован другой счет"; break;
                        default:        s_Deint="причина деинициализации не ясна"; break;
                }
                if(UseCreateHistoryDraw && UseDelHistoryDraw){
                        HistoryDrawDelete();
                }
                Print("Советник ",NameExpert," на инструменте ",Symbol()," деинициализирован. Причина: ",s_Deint);
                Comment("");
        }
        return(0);
}
// ================================================================================================+
// ================================================================================================|
//           =============           СТАРТ РАБОТЫ СОВЕТНИКА           =============                |
// ================================================================================================|
// ================================================================================================+
int start(){
        
        // ===============================================================================================
        // ======================= Блок отрисовки истории торгов =========================================
        // ===============================================================================================
                if(isNewBar() && UseCreateHistoryDraw){
                        HistoryDrawCreate();
                }
        // ===============================================================================================
        
        
        return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| функция isNewBar() - возвращает признак нового бара                   |
//+------------------------------------------------------------------+
bool isNewBar(){
  bool res=false;
  if(myBars!=Bars){
    res=true;
    myBars=Bars;
  }   
        return(res);
}
//--------------------------------------------------------------- 
// -------------------------- HistoryDrawCreate() --------------------------------------------------
// функция удаляет историю торгов, прорисованную на графике
// --------------------------------------------------------
void HistoryDrawCreate(){
  string        FunctionName="HistoryDrawDelete()";
        string SMB=Symbol();
  double OpenBuy=0.0,CloseBuy=0.0,OpenSell=0.0,CloseSell=0.0;//координаты отрезков
  int Ticket;
  string L_name,Tip,Open_name,Close_name;
  datetime TimeOpenBuy=0,TimeCloseBuy=0,TimeOpenSell=0,TimeCloseSell=0;
  for(int i=0; i<OrdersHistoryTotal(); i++){
    if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
                        Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
                        Print(" ============== ",FunctionName," ============== ");
                }
    else{
                        if(OrderSymbol()!=SMB){continue;}
                        if(OrderType()==OP_BUY){
                        // ------------- получаем параметры линий --------------
                                OpenBuy=OrderOpenPrice();
                                CloseBuy=OrderClosePrice();
                                Ticket=OrderTicket();
                                TimeOpenBuy=OrderOpenTime();
                                TimeCloseBuy=OrderCloseTime();
                                // ---- генерируем имена объектов ------
                                Tip="Buy";//тип сделки
                                L_name="L_"+Tip+" № "+Ticket;
                                Open_name="Open"+Tip+" № "+Ticket;//стрелка, открывающая сделку
                                Close_name="Close"+Tip+" № "+Ticket;//стрелка, закрывающая сделку
                                // ---- создаём открывающую стрелку ------------
                                ObjectCreate(Open_name,OBJ_ARROW,0,TimeOpenBuy,OpenBuy);//открывающая стрелка Бай-ордера
                                ObjectSet(Open_name,OBJPROP_ARROWCODE,1);//код стрелки 232 
                                ObjectSet(Open_name,OBJPROP_COLOR,Blue);//цвет стрелки
                                // ---- создаём закрывающую стрелку ------------
                                ObjectCreate(Close_name,OBJ_ARROW,0,TimeCloseBuy,CloseBuy);//закрывающая стрелка Бай-ордера
                                ObjectSet(Close_name,OBJPROP_ARROWCODE,3);//код стрелки  231
                                ObjectSet(Close_name,OBJPROP_COLOR,Blue);//цвет стрелки
                                // ---- создаём линии ------------ 
                                ObjectCreate(L_name,OBJ_TREND,0,TimeOpenBuy,OpenBuy,TimeCloseBuy,CloseBuy);//
                                ObjectSet(L_name,OBJPROP_RAY,false);//запрещаем рисовать луч
                                ObjectSet(L_name,OBJPROP_WIDTH,0);//устанавливаем толщину линии ()
                                ObjectSet(L_name,OBJPROP_STYLE,0);//устанавливаем тип линии (отрезки)
                                ObjectSet(L_name,OBJPROP_STYLE,STYLE_DOT);//устанавливаем тип штриховки(пунктирная линия)
                                ObjectSet(L_name,OBJPROP_COLOR,Blue);//устанавливаем цвет(синий/красный)
                        }
                        if(OrderType()==OP_SELL){
                                // ------------- получаем параметры линий ------------
                                OpenSell=OrderOpenPrice();
                                CloseSell=OrderClosePrice();
                                Ticket=OrderTicket();
                                TimeOpenSell=OrderOpenTime();
                                TimeCloseSell=OrderCloseTime();
                                // ---- генерируем имена объектов ------
                                Tip="Sell";//тип сделки
                                L_name="L_"+Tip+" № "+Ticket;
                                Open_name="Open"+Tip+" № "+Ticket;//стрелка, открывающая сделку
                                Close_name="Close"+Tip+" № "+Ticket;//стрелка, закрывающая сделку
                                // ---- создаём открывающую стрелку ------------
                                ObjectCreate(Open_name,OBJ_ARROW,0,TimeOpenSell,OpenSell);//открывающая стрелка Sell-ордера
                                ObjectSet(Open_name,OBJPROP_ARROWCODE,1);//код стрелки 232 
                                ObjectSet(Open_name,OBJPROP_COLOR,Red);//цвет стрелки
                                // ---- создаём закрывающую стрелку ------------
                                ObjectCreate(Close_name,OBJ_ARROW,0,TimeCloseSell,CloseSell);//закрывающая стрелка Sell-ордера
                                ObjectSet(Close_name,OBJPROP_ARROWCODE,3);//код стрелки  231
                                ObjectSet(Close_name,OBJPROP_COLOR,Red);//цвет стрелки
                                
                                // ---- создаём линии ------------
                                ObjectCreate(L_name,OBJ_TREND,0,TimeOpenSell,OpenSell,TimeCloseSell,CloseSell);//
                                ObjectSet(L_name,OBJPROP_RAY,false);//запрещаем рисовать луч
                                ObjectSet(L_name,OBJPROP_WIDTH,0);//устанавливаем толщину линии ()
                                ObjectSet(L_name,OBJPROP_STYLE,0);//устанавливаем тип линии (отрезки)
                                ObjectSet(L_name,OBJPROP_STYLE,STYLE_DOT);//устанавливаем тип штриховки(пунктирная линия)
                                ObjectSet(L_name,OBJPROP_COLOR,Red);//устанавливаем цвет(синий/красный)
                        }  
                }
        }
}
// -------------------------- HistoryDrawDelete() --------------------------------------------------
// функция удаляет историю торгов, прорисованную на графике
// --------------------------------------------------------
void HistoryDrawDelete(){
        string  FunctionName="HistoryDrawDelete()";
        string SMB=Symbol();
        double OpenBuy=0.0,CloseBuy=0.0,OpenSell=0.0,CloseSell=0.0;//координаты отрезков
  int Ticket;
  string L_name,Tip,Open_name,Close_name;
  datetime TimeOpenBuy=0,TimeCloseBuy=0,TimeOpenSell=0,TimeCloseSell=0;
  for(int i=0;i<OrdersHistoryTotal();i++){
                if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
                        Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
                        Print(" ============== ",FunctionName," ============== ");
                }
                else{
                        if(OrderSymbol()!=SMB){continue;}
                        if(OrderType()==OP_BUY){
                                // ------------- получаем параметры линий --------------
                                OpenBuy=OrderOpenPrice();
                                CloseBuy=OrderClosePrice();
                                Ticket=OrderTicket();
                                TimeOpenBuy=OrderOpenTime();
                                TimeCloseBuy=OrderCloseTime();
                                // ---- генерируем имена объектов ------
                                Tip="Buy";//тип сделки
                                L_name="L_"+Tip+" № "+Ticket;
                                Open_name="Open"+Tip+" № "+Ticket;//стрелка, открывающая сделку
                                Close_name="Close"+Tip+" № "+Ticket;//стрелка, закрывающая сделку
                                // ---- удаляем открывающую стрелку ------------
                                ObjectDelete(Open_name);//открывающая стрелка Бай-ордера
                                // ---- удаляем закрывающую стрелку ------------
                                ObjectDelete(Close_name);//закрывающая стрелка Бай-ордера
                                // ---- удаляем линии ------------ 
                                ObjectDelete(L_name);//
                        }
                        if(OrderType()==OP_SELL){
                                // ------------- получаем параметры линий ------------
                                OpenSell=OrderOpenPrice();
                                CloseSell=OrderClosePrice();
                                Ticket=OrderTicket();
                                TimeOpenSell=OrderOpenTime();
                                TimeCloseSell=OrderCloseTime();
                                // ---- генерируем имена объектов ------
                                Tip="Sell";//тип сделки
                                L_name="L_"+Tip+" № "+Ticket;
                                Open_name="Open"+Tip+" № "+Ticket;//стрелка, открывающая сделку
                                Close_name="Close"+Tip+" № "+Ticket;//стрелка, закрывающая сделку
                                // ---- удаляем открывающую стрелку ------------
                                ObjectDelete(Open_name);//открывающая стрелка Sell-ордера
                                // ---- удаляем закрывающую стрелку ------------
                                ObjectDelete(Close_name);//закрывающая стрелка Sell-ордера
                                // ---- удаляем линии ------------
                                ObjectDelete(L_name);//
                        }  
                }
  }
}
Причина обращения: