Советники: Копирование сделок с одного счёта на другой (Советники ExpertSource и ExpertReceiver) - страница 2

 

В общем случае - Приёмник не знает по какой торговой системе работает источник сигналов. Поэтому выставление стопов - это ещё не гарантия, что при отсутствии связи не нарушится работа системы у приёмника (даже если стопы на сервере и сработают). Может на самом деле стопы у источника будут отсутствовать на момент, когда на приёмнике ордер закроется по ним.

А поэтому в любом случае надо будет держать связь с источником.

 

Ваши советники не работают для роботов. Только для ручной торговли. :((( Разочарован.

 
vldim:

Ваши советники не работают для роботов. Только для ручной торговли. :((( Разочарован.

Неправ. Я разобрался все работает отлично, полноценный советник. Спасибо Автору, то что нужно, вещь.

 
Как можно ускорить срабатывание экспертов??? Даже при минимальной загруженности терминалов и спокойном рынке на копирование сдлеки уходит от 5 до 10 секунд... Можно ли как-то упростить код, исключить ненужное... если возможно? Сам в коде практически не разбираюсь. Программисты - помогите...
 

Автор молодец: придумал хорошее решение, выложил исходник.
Спасибо ему!
Вот только, если поставить отложенный ордер, а потом удалить,
то получим в результате пустой файл в папке-источнике и ордер
в копируемом терминале не удалится.

Выглядит это так: приемник находит пустой файл и читает строки:
k=FileReadArray(handle,buffer,0,1000);

В результате
k=0
а это значит, что строк нет и обрабатывать нечего, а по факту нужно удалить
ордера, которые были выставлены ранее.

Для этого в функции FileLoad добавил вот это:

      if (k==0) { 
        Print ("Delete all orders! File with orders is empty.");
        for (i = total-1; i >= 0; i--) {
          Print ("Delete all orders. for i = " +i);
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
            OrderDelete(OrderTicket() );
          }
        } // for

И еще в самом начале получил ошибку с сообщением о том, что открыто слишком много файлов в Советнике-источнике ExpertSource.mq4.
Поисправлял места, где файл нужно было закрывать и через полдня скрипт, вроде бы заработал.

Одно из таких мест здесь:

      handle=FileOpen(FileName,FILE_BIN|FILE_WRITE);
      if(FileWriteArray(handle, buffer, 0, j)>0) {
         FileClose(handle); 
         // Но если FileWriteArray(handle, buffer, 0, j) <= 0 то файл не
         // закроется. А потом не отработает FileDelete(FileName);
         j = _lopen(Path+slash+FileName,OF_READ);
         if(j<0) {//Файл не перезаписываем!
            CopyFileA(TerminalPath()+"\experts\files"+slash+FileName, Path+slash+FileName, 0);
         } else {
            _lclose(j);
            FileDelete(FileName); // Не получится удалить, так
            // как файл еще не закрыт после handle=FileOpen(FileName,FILE_BIN|FILE_WRITE);
             Print("Файл ордеров удалён, потому что файл, находящийся у получателя, ещё не обработан.");
         }
      }

Лучше сразу получить результат выполнения FileWriteArray(handle, buffer, 0, j)>0
в переменную и
закрыть файл так:

      handle=FileOpen(FileName,FILE_BIN|FILE_WRITE);
      int iArrayElements = FileWriteArray(handle, buffer, 0, j);
      FileClose(handle);
      Print("FileWriteArray=" +iArrayElements );
      if(iArrayElements >= 0) {
         j = _lopen(Path+slash+FileName,OF_READ);
         if(j<0) { //Если файла в приемнике нет, то копируем из источника.
            CopyFileA(TerminalPath()+"\experts\files"+slash+FileName, Path+slash+FileName, 0);
            Print("Файл ордеров скопирован из источника в приемник.");
         } else {  // Файл в приемнике еще не обработан.
            _lclose(j);
            FileDelete(FileName);
            Print("Файл ордеров удалён, потому что файл, находящийся у получателя, ещё не обработан.");
         }
      }

Что-то еще правил наверное, но уже не вспомню точно.
Вот только на разных серверах гонять копирование проблематично
из за разницы в котировках и условиях выставления ордеров.

Быть может, доведу до ума и опубликую. Вообще очень плохо пониаю MQL,
но делать нечего - нужно включать мозги и решать задачи. :-)

 

Кстати, видел продает такой скрпит KimIV (Игорь) по цене 1000 USD и
1200 за позможность зеркалить сделки.

Полагаю, что это явно перебор, хотя, может кто-то так и зарабатывает.
Мне скрипт нужен по банальной причине: торгую очень много, но больше
в минус. Если лосей перевернуть и удвоить объем в деньгах, то получим
на выходе профит, превосходящий лосей. Этого будет достаточно, чтобы
постепенно тренироваться.

Но четко перевернуть технически очень сложно из-за проскальзывания
и прочих форс-мажорных факторов даже при использовании отложенных
ордеров. Потому это абсолютно не Грааль и цена ему баксоов 100,
как максимум.

А вот проверить идею на демке будет не лишним.

 
Не могу разобратся с "получателем":
ExpertReceiver


Цитирую из описания: "FileName - Имя файла в каталоге TerminalPath()+"\experts\files", с которого будут считываться данные о изменениях в ордерах." ---- не совсем понятно, что именно вписывать в настройки получателя. Я так понимаю, нужно в получателе создать полный путь к Orders.txt который находится в папке терминала "сигнальщика"? Делал по всякому уже, не получается что то...
В первом терминале (сигнальщике) все работает, все настроил, открываю ордер и в файле Orders.txt появляется запись о открытии ордера, с этим все в порядке. Но вот что в получателе вписывать? Пробовал писать полный путь сигнальщика, например у меня это (без кавычек): "C:\MT4Terminals\MetaTraderSignal\experts\files" или же: "C:\MT4Terminals\MetaTraderSignal\experts\files\Orders.txt" ничего не получается. Или надо вот это " TerminalPath()+"\experts\files" " ---- сюда еще вписывать или как быть? Не могли бы Вы мне пояснить какой путь мне вписать к файлу.
 
con-dor:
Но вот что в получателе вписывать? Пробовал писать полный путь сигнальщика, например у меня это (без кавычек): "C:\MT4Terminals\MetaTraderSignal\experts\files" или же: "C:\MT4Terminals\MetaTraderSignal\experts\files\Orders.txt" ничего не получается. Или надо вот это " TerminalPath()+"\experts\files" " ---- сюда еще вписывать или как быть? Не могли бы Вы мне пояснить какой путь мне вписать к файлу.


Просто "Orders.txt" (без кавычек)
 
EvgeTrofi:
con-dor:
Но вот что в получателе вписывать? Пробовал писать полный путь сигнальщика, например у меня это (без кавычек): "C:\MT4Terminals\MetaTraderSignal\experts\files" или же: "C:\MT4Terminals\MetaTraderSignal\experts\files\Orders.txt" ничего не получается. Или надо вот это " TerminalPath()+"\experts\files" " ---- сюда еще вписывать или как быть? Не могли бы Вы мне пояснить какой путь мне вписать к файлу.


Просто "Orders.txt" (без кавычек)

Всем привет, у меня такая проблема с этим копировщиком:

 Советник-источник ExpertSource.mq4 пишет файл Orders.txt не туда, куда сказали в переменной Path, а в свой каталог(TerminalPath())! а ведь должен писать в каталог ("D:\MetaTraderПолучатель\experts\files") где стоит ExpertReceiver.mq4.

Уважаемый разработчик, проясните свет на эту проблему, может я что не так сделал? 

 
dmitriy086:
EvgeTrofi:
con-dor:
Но вот что в получателе вписывать? Пробовал писать полный путь сигнальщика, например у меня это (без кавычек): "C:\MT4Terminals\MetaTraderSignal\experts\files" или же: "C:\MT4Terminals\MetaTraderSignal\experts\files\Orders.txt" ничего не получается. Или надо вот это " TerminalPath()+"\experts\files" " ---- сюда еще вписывать или как быть? Не могли бы Вы мне пояснить какой путь мне вписать к файлу.


Просто "Orders.txt" (без кавычек)

Всем привет, у меня такая проблема с этим копировщиком:

Советник-источник ExpertSource.mq4 пишет файл Orders.txt не туда, куда сказали в переменной Path, а в свой каталог(TerminalPath())! а ведь должен писать в каталог ("D:\MetaTraderПолучатель\experts\files") где стоит ExpertReceiver.mq4.

Уважаемый разработчик, проясните свет на эту проблему, может я что не так сделал?

ExpertSource должен писать файл Orders.txt сначала в свой каталог, а после этого должен его копировать от туда в папку, которую Вы назначили в переменную Path.

Если не копирует - значит ищите корень проблемы в правах доступа пользователя Windows и программы "terminal.exe" к папке Path.

Попробуйте создать на диске D папку test и попробовать снова. Если файл там не появится, то не знаю.... у меня всё работает.