Советники: klot

 

klot:

Эксперт, который позволяет совершать сделки вручную при визуальном тестировании.

Author: Dmitrii

 
Скрипт, который позволяет совершать сделки вручную.

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

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);
  }
//------------------------------------------------------------------+
 
Editor:
К сожалению, к Вашему коду есть замечания:

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

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

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

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

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

В исходный пришлось внести изменения, так как были ошибки.
Этот же код в скрипте работает.
Функции открытия и закрытия позиций изменил в соответствии с Вашими
 

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

 
klot:

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

Залил новую версию :)
 
 

Скрипт при проверки выдает 77 ошибок ! Помогите разобраться

 
Matte:

Скрипт при проверки выдает 77 ошибок ! Помогите разобраться


Это не скрипт а эксперт, его нужно в папочку эксперты положить.
 
Да, еще такое замечание библиотека DLL-ка чуствительна к названию окна терминала.
Некоторые брокеры спользуют собственное название терминала. Там эксперт работать не будет.
Нужно установить терминал из первоисточника.
 

Уважаемые программисты было бы замечательно если бы вы смогли объединить скрипт StepbyStep ('StepByStep') c klot, т.е. сделать возможность выстовлять ордера в StepbyStep что сделало бы этот скрипт незаменимым Forex Simulator. Спасибо за ваши старания

Причина обращения: