Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй программы в Code Base. Увеличивай свой рейтинг!
MetaQuotes Software Corp.
Модератор
177202
MetaQuotes Software Corp. 2006.09.11 13:25 

klot:

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

Author: Dmitrii

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

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

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

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

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

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

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

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

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

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

Dmitrii
330
Dmitrii 2006.09.10 18:45  
klot:

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

Залил новую версию :)
MQL4 Comments
16309
MQL4 Comments 2006.09.13 09:37  
MQL4 Comments
16309
MQL4 Comments 2006.09.13 09:49  

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

Dmitrii
330
Dmitrii 2006.09.13 15:22  
Matte:

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


Это не скрипт а эксперт, его нужно в папочку эксперты положить.
Dmitrii
330
Dmitrii 2006.09.13 15:25  
Да, еще такое замечание библиотека DLL-ка чуствительна к названию окна терминала.
Некоторые брокеры спользуют собственное название терминала. Там эксперт работать не будет.
Нужно установить терминал из первоисточника.
MQL4 Comments
16309
MQL4 Comments 2006.09.16 21:17  

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

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий