MQL4 - automated forex trading   /  

Code Base

Code Base  Советники  klot Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый код

Этот индикатор для
MetaTrader 4

Мобильный трейдинг!
Купите лицензию и торгуйте мобильно

Имя:
klot
Автор: klot (11.09.2006 15:25)
Скачано: 2815
Скачать:
 IdleLib.dll (60.0 Kb)
 Visual_Handle_Tranning_51_4.mq4 (25.4 Kb) View


    Написал небольшого эксперта, который позволяет совершать сделки вручную при визуальном тестировании. Может кому пригодится для тренировки.

    Порядок работы такой:
1. Включаете на визуальное тестирование этого эксперта.
2. Далее
 

//+------------------------------------------------------------------+
//|                                       Visual_Handle_Tranning.mq4 |
//+------------------------------------------------------------------+
//|  b - открыть позицию Buy;                                        |
//|  s - открыть позицию Sell;                                       |
//|  "стрелка вверх" - закрыть все BUY;                              |
//|  "стрелка вниз" - закрыть все SELL;                              |
//|  t - включает трейлинг стоп общий;                               |
//|  r - выключает трейлинг стоп;                                    |
//|  d - удаление всех отложенных ордеров.                           |
//|    Для выставления отложенного ордера мышкой выбираем из меню    |
//|  значков "Стрелочку вверх" для Buy-ев и щелкаем в том месте,     |
//|  где планируем поставить ордер. Если щелкнуть выше цены, то      |
//|  будет BuyStop, если ниже - будет BuyLimit.                      |
//|  для Sell-ов, соответственно, значек "стрелочка вниз".           |
//|              Модификация отдельных ордеров:                      |
//|  Двойным щелчком мыши выделяем нужный нам значек-ордер           |
//|  далее, щелкаем по нему правой клавишей мыши                     |
//|  и выбираем свойства Arrow.                                      |
//|  Далее, меняем в поле "Описание" нужные параметры отдельного     |
//|  ордера.                                                         |
//|  Можно менять SL, TP, а также закрыть рыночный ордер             |
//|  или удалить отложенный Вместо EMPTY пишем close или del         |
//|   ВАЖНО сохранить пробелы - это разделители !!!                  |
//|  Формат поля "Описание", разделитель-"ПРОБЕЛ!!!":                |
//|  |  1   |  2   | 3 |  4   | 5 |  6   |   7    |  8  |            |
//|  Price= 1.2565 SL= 1.2765 TP= 1.2265 Команда= close              |
//|  |      |      |   |      |   |      |        |     |            |
//|  Команда на закрытие рыночного ордера - close                    |
//|  Удаление отложенного - del                                      |
//+------------------------------------------------------------------+


                       
    Обсуждение тут:   http://forum.mql4.com/ru/3870/page3


    PS. Для работы эксперта требуется, чтобы файл IdleLib.dll лежал в папке c:\Program Files\MetaTrader 4\experts\libraries\ 

    Файл IdleLib.dll можно скачать из http://codebase.mql4.com/ru/349


16 комментариев: 1 2   Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый комментарий

13.09.2006 11:37 Matte
klot писал(а):

Посмотрите, пожалуйста, вроде все работает как надо :)

Залил новую версию :)
10.09.2006 20:45 klot

Посмотрите, пожалуйста, вроде все работает как надо :)

10.09.2006 13:01 klot
Editor писал(а):
К сожалению, к Вашему коду есть замечания:

Советник не открывает позиции.

Пожалуйста, внесите необходимые изменения.

В исходный пришлось внести изменения, так как были ошибки.
Этот же код в скрипте работает.
Функции открытия и закрытия позиций изменил в соответствии с Вашими
08.09.2006 17:13 klot
Editor писал(а):
К сожалению, к Вашему коду есть замечания:

Советник не открывает позиции.

Пожалуйста, внесите необходимые изменения.

В исходный пришлось внести изменения, так как были ошибки.
Этот же код в скрипте работает.
Устранил серьезный баг, связанный с инициализацией DLL-ки на каждом тике. Добавил трейлинг включается клавишей "t"
08.09.2006 17:03 klot
Скрипт, который позволяет совершать сделки вручную.

Порядок работы такой:

1. Прикрепите скрипт к окну графика;

2. Далее нажимаете клавишу "b" - это покупка, "s" - продажа, "c" - закрытие.

//+------------------------------------------------------------------+
//|                                Visual_Handle_Tranning_Script.mq4 |
//|                                             Viatcheslav Suvorov  |
//+------------------------------------------------------------------+
#property copyright "Viatcheslav Suvorov"
#property show_inputs
#include <WinUser32.mqh>
#define MAGICEXP 00000001
#include <stdlib.mqh>
//----
#import "IdleLib.dll"
int GetLastKeyWP();
int IdleLibInit();
int IdleLibUnInit();
string GetActiveWndName();
#import
//---
extern double Lots = 0.1;
int nGetLastError;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   IdleLibInit(); //инициализируем Dll для перехвата событий   
   bool NeedLoop = true;  
   while(NeedLoop)
     {           
       int lastkey = GetLastKeyWP(); //Опрашиваем код посл. клавиши
//Имя окна Metatrader где произошло событие       
       string lastwnd = GetActiveWndName();
// Проверяем, есть ли открытые позиции       
       int pos = Check_for_open_pos(); 
       // Команда на открытие Buy клавиша "b"-код 66   
       if((lastwnd != "") && (lastkey == 66) && pos != 1)
         {             
           buy_open(0, 0);
   //Print("Код нажатой клавиши = ",lastkey, " из окна ", lastwnd);
         }  
       // Команда на открытие Sell клавиша "s"-код 83
       if((lastwnd != "") && (lastkey == 83) && pos != -1)
         {             
           sell_open(0, 0);
     // Print("Код нажатой клавиши=",lastkey," из окна ",lastwnd);
         }  
       // Команда на закрытие позиции клавиша "c"-код 67
       if((lastwnd != "") && (lastkey == 67) )
         {             
           close_order(0, 0);
           // Print("Код нажатой клавиши=",lastkey," из окна ",lastwnd);
         }  
   //---                          
       Sleep(100);
     }//while                
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void deinit()
  {
   IdleLibUnInit();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void buy_open(double TP, double SL)
  {
   int ticket, ExtShotsCounter, lasterror;
   RefreshRates();
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, 
                      SL, TP, 0, MAGICEXP, 0, Magenta);
   if(ticket > 0)
     { 
       if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) 
           Print("BUY order opened : ", OrderOpenPrice());
// if(!ScreenShot(ExtShotsCounter + "Open_" + Hour() + ".gif", 
      640, 480)) 
       //     lasterror = GetLastError();
       // else 
       //     ExtShotsCounter++;       
     }
   else 
       Print("Error opening BUY order : ", 
             ErrorDescription(GetLastError())); 
   return;
  } 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void sell_open(double TP, double SL)
  {
   int ticket, ExtShotsCounter, lasterror;
   RefreshRates();
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, 
                      SL, TP, 0, MAGICEXP, 0, Red);
   if(ticket > 0)
     {
       if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) 
           Print("Sell order opened : ", OrderOpenPrice());
     }
   else 
       Print("Error opening Sell order : ", 
             ErrorDescription(GetLastError())); 
   return;
  } 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void close_order(int k = 0, int n = 0)
  {
   int nOrdersTotal = OrdersTotal();
//----
   for(int i = nOrdersTotal - 1; i >= 0; i--)
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       nGetLastError = GetLastError();
       //----
       if(nGetLastError != 0)
         { 
           Print("Error selecting order : ", 
                 ErrorDescription(nGetLastError)); 
           continue;
         }
       //----
       if(OrderMagicNumber() != MAGICEXP || OrderSymbol() != Symbol()) 
           continue;
       //---- check order type 
       if(OrderType() == OP_BUY && (n == 1 || n == 0))
         {
           if(OrderProfit() > 0 && k == 1 ) 
             {
               RefreshRates();
               OrderClose(OrderTicket(), OrderLots(), Bid, 3, Aqua);
             }
           //----
           if(k == 0) 
             {
               RefreshRates();
               OrderClose(OrderTicket(), OrderLots(), Bid, 3, Aqua);
               nGetLastError = GetLastError();
               //----
               if(nGetLastError != 0)
                   Print("Error closing BUY order : ", 
                         ErrorDescription(nGetLastError)); 
             }
         } 
       //----
       if(OrderType() == OP_SELL && (n == -1 || n == 0))
         {
           if(OrderProfit() > 0 && k == 1) 
             {
               RefreshRates();
               OrderClose(OrderTicket(), OrderLots(), Ask, 3, Yellow);
             }
           //----
           if(k == 0) 
             {
               RefreshRates();   
               OrderClose(OrderTicket(), OrderLots(), Ask, 3, Yellow);
               nGetLastError = GetLastError();
               if(nGetLastError != 0)
                   Print("Error closing SELL order : ", 
                         ErrorDescription(nGetLastError));         
             }
         }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Check_for_open_pos()
  {
   int ticket, cnt, pos;
   if(OrdersTotal() > 0) 
     {
       for(cnt = 0; cnt < OrdersTotal(); cnt++)
         {
           OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
           nGetLastError = GetLastError();
           //----
           if(nGetLastError != 0)
             { 
               Print("Error selecting order : ", 
                     ErrorDescription(nGetLastError)); 
               continue;
             }
           //----
           if(OrderMagicNumber() != MAGICEXP || 
              OrderSymbol() != Symbol()) 
               continue;
           //----
           if(OrderType() == OP_SELL ) 
               pos = -1; 
           //----
           if(OrderType() == OP_BUY )  
               pos = 1;
         }
     }
   return(pos);
  }
//------------------------------------------------------------------+


08.09.2006 16:30 Editor