Подскажите, пожалуйста, как запустить внешнее приложение из индикатора?

 
Доброго всем времени суток! Я полный профан в языке, потому очень прошу помочь! Как запустить внешнее приложение Винды при совпадении текущей цены BID и текущего значения индикатора, который пишется в буфер на вывод? Помогите, пожалуйста!!!
 
startdata:
Доброго всем времени суток! Я полный профан в языке, потому очень прошу помочь! Как запустить внешнее приложение Винды при совпадении текущей цены BID и текущего значения индикатора, который пишется в буфер на вывод? Помогите, пожалуйста!!!
Я обычно делаю так:
//+------------------------------------------------------------------+
//|                                                     template.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//---- импорт функции из внешней DLL
#import "shell32.dll"
   int ShellExecuteA(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
#import
//---- константы открытия\показа (параметр nShowCmd)
#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_FORCEMINIMIZE    11
#define SW_MAX              11
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
//---- запуск командной строки
   ShellExecuteA(WindowHandle(Symbol(),0),"open","cmd.exe",NULL,NULL,SW_SHOWNORMAL);
//----
   return(0);
}
Для того, чтобы этот код работал, необходимо разрешить импорт DLL в терминале:
Сервис -> Настройки -> Советники -> Разрешить импорт DLL.
 

Спасибо! Оно! Разобрался и присоединил к своему индюку!

 

Ilnur

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

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

ф-ю ShellExecuteA в MetaEditore нет. Дело в том, что мне нужно, из советника или индикатора (в общем это не важно) запустить бат-файл.

Так вот скрипт видит бат-файл запускает его, но сам бат-файл не выполняет действия, которые в нем заложены. Причем запуская вручную он работает без проблем, но из советника запускается, но не выполняется. Не знаю, что нужно сделать, как его адаптировать под свои задачи, в скрипте только одна ф-я, helpa накоторую не могу найти. Помогите, пожалуйста, заранее спасибо!

startdata может Вы можете помоч?

 
Хелпа на данную функцию в MetaEditore вы и не найдете т.к. это функция не из состава функций MQL. Это WinApi функция которая импортируется из shell32.dll потаму хелп по ней надо смотреть или в MSDN или в какомнибудь справочнике по WinApi или через yandex.
 
iskatel:

Ilnur

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

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

ф-ю ShellExecuteA в MetaEditore нет. Дело в том, что мне нужно, из советника или индикатора (в общем это не важно) запустить бат-файл.

Так вот скрипт видит бат-файл запускает его, но сам бат-файл не выполняет действия, которые в нем заложены. Причем запуская вручную он работает без проблем, но из советника запускается, но не выполняется. Не знаю, что нужно сделать, как его адаптировать под свои задачи, в скрипте только одна ф-я, helpa накоторую не могу найти. Помогите, пожалуйста, заранее спасибо!


К сожалению вы не представили исходный код скрипта, в котором запускается ваш bat-файл.


В примере представленном выше для запуска внешнего bat-файла необходимо только указать полный путь:


int start()
{
//---- запуск bat-файла
   ShellExecuteA(WindowHandle(Symbol(),0),"open","C:\sample.bat",NULL,NULL,SW_SHOWNORMAL);
//----
   return(0);
}

Кстати существует альтернативный (более простой) способ запуска внешнего приложения (.exe, .bat ...) 
из скрипта MQL: WinAPI функция WinExec()


//+------------------------------------------------------------------+
//|                                                     template.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//---- импорт функции из внешней DLL
#import "kernel32.dll"
   int WinExec(string lpCmdLine,int uCmdShow);
#import
//---- константы открытия\показа (параметр uCmdShow)
#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_FORCEMINIMIZE    11
#define SW_MAX              11
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
//---- запуск bat-файла
   WinExec("C:\sample.bat",SW_SHOWNORMAL);
//----
   return(0);
}
 
Ilnur:
iskatel:

Ilnur

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

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

ф-ю ShellExecuteA в MetaEditore нет. Дело в том, что мне нужно, из советника или индикатора (в общем это не важно) запустить бат-файл.

Так вот скрипт видит бат-файл запускает его, но сам бат-файл не выполняет действия, которые в нем заложены. Причем запуская вручную он работает без проблем, но из советника запускается, но не выполняется. Не знаю, что нужно сделать, как его адаптировать под свои задачи, в скрипте только одна ф-я, helpa накоторую не могу найти. Помогите, пожалуйста, заранее спасибо!

К сожалению вы не представили исходный код скрипта, в котором запускается ваш bat-файл.


В примере представленном выше для запуска внешнего bat-файла необходимо только указать полный путь:


int start()
{
//---- запуск bat-файла
   ShellExecuteA(WindowHandle(Symbol(),0),"open","C:\sample.bat",NULL,NULL,SW_SHOWNORMAL);
//----
   return(0);
}

Кстати существует альтернативный (более простой) способ запуска внешнего приложения (.exe, .bat ...)
из скрипта MQL: WinAPI функция WinExec()


//+------------------------------------------------------------------+
//|                                                     template.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//---- импорт функции из внешней DLL
#import "kernel32.dll"
   int WinExec(string lpCmdLine,int uCmdShow);
#import
//---- константы открытия\показа (параметр uCmdShow)
#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_FORCEMINIMIZE    11
#define SW_MAX              11
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
//---- запуск bat-файла
   WinExec("C:\sample.bat",SW_SHOWNORMAL);
//----
   return(0);
}


Да, не ожидал получить ответы. Большое спасибо.

Скрипт не выложил, потому, что посчитал странным показывать Вам Ваш же скрипт, я там вставил только имя своего файла, так как было показано выше ShellExecuteA(WindowHandle(Symbol(),0),"open","cmd.exe",NULL,NULL,SW_SHOWNORMAL);, я не программист, напрягаюсь пишу скрипты для автоматизации своей работы, поэтому пишу все добуквенно как вижу. На других программерских форумах выкладывал скрипт, там тоже знающие сказали, что вопрос в полном пути к файлу. Сам файл лежал в папке Windows. Но меня сбило с толку то, что открывалось черное консольное окно. В бат-файл я вставил для проверки команду PAUSE, в консоли пишется нажмите любую клавишу, нажимаю, консоль исчезает и ничего не происходит. Но уверен, что проблемма решена, хотя проверить я это смогу только в понедельник.

Еще раз большое спасибо, также за новый вариант.

Еще хочу спросить, может есть какая-то фишка, что бы копировать созданный файл из стандартной дирректории одного терминала в другой. MQL4 это не позволяет, но может есть подобный вариант не MQL-скими ф-ми, Может эта же ShellExecuteА, только вместо "open" поставить "xcopy", но говорят это не надежно. И где вписать дирректорию назначения? Не знаю. Буду рад любой помощи.

 

С помощью WinAPI это возможно. Вот пример:


//+------------------------------------------------------------------+
//|                                                     template.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
 
//---- импорт API-функции из системной DLL
#import "kernel32.dll"
   bool CopyFileA(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
#import
 
//+------------------------------------------------------------------+
//| Основная функция скрипта                                           |
//+------------------------------------------------------------------+
int start()
{
/*
   Функция копирует файл из одного указанного места в другое. Если файл существует, 
   то функция перезаписывает его. Старые данные при этом УНИЧТОЖАЮТСЯ. Если имя файла 
   содержит несуществующую директорию, то функция вернет ошибку.
   Параметры:
      lpExistingFileName - полное имя копируемого файла.
      lpNewFileName - полный путь, куда будет скопирован исходный файл.
*/
   bool bRetValue = CopyFileA("C:\Program Files\MetaTrader\experts\files\sample.txt","C:\sample.txt",false);
   if(!bRetValue) Print("Ошибка копирования файла!");
}


 

Ilnur

Большое спасибо, на конец-то все до делал. Все работает замечательно. Успехов Вам. Попутных трендов...

 
Ilnur:
//+------------------------------------------------------------------+
//|                                                     template.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//---- импорт функции из внешней DLL
#import "kernel32.dll"
   int WinExec(string lpCmdLine,int uCmdShow);
#import
//---- константы открытия\показа (параметр uCmdShow)
#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_FORCEMINIMIZE    11
#define SW_MAX              11
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
//---- запуск bat-файла
   WinExec("C:\sample.bat",SW_SHOWNORMAL);
//----
   return(0);
}


Вопросы...

1. Зачем дефайнить если и без этого работает?

2. Чем обьяснить выбор чисел для дефайна, да ещё и с повторениями?


//+------------------------------------------------------------------+
//|    Запуск приложения.                                 Скрипт.mq4 |
//+------------------------------------------------------------------+
#property show_inputs
//---- импорт функции из внешней DLL
#import "kernel32.dll"
   int WinExec(string lpCmdLine,int uCmdShow);
#import
//+------------------------------------------------------------------+
int start()
{
  WinExec("c:\Program Files\Internet Explorer\Iexplore.exe",1); return(0);
}
//-------------------------------------------------------------------+
 

kombat понятное дело, ведь совершенству нет предела. А лишнее, что не надо уберем, главное работает.

У меня еще есть вопрос. Никак не получается в файле CSV прочитать последнюю строчку. Уж как я не крутил FileSeek не получается. Подробнее: после закрытия позиции вручную перебрасываю лог файл журнала в стандартную дирректорию, читаю советником последнюю строчку. Хочу взять от туда номер закрытого тикета, обьем, цены (может есть другая технология для сохранения этих данных в файл, пока ни чего другого не придумал).

Уверен все решается легко и просто. Помогите разобраться с файлоуказателем

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