На главную страницу

Переписка с пользователями по вопросам работы с модулем и библиотекой.

(новые вопросы добавляются в конец страницы)
      
      
#1             
X: Дим, слушай, что за глюк такой... закрывается час в 14-00, потом идет свеча 14-01 и потом еще одна 14-02? Робат глюк словил...
  Такие глюки в данных Метастока время от времени бывают. Я пытался выяснить причину, грешил на терминал, на биржу, на связь, но так и не разобрался. Для отстройки от таких глюков, на первом и нулевом барах справа, можно в формулах на открытие позиций в Советнике добавлять следующие проверки:
AND Mod( Minute(), 5)=0 AND Ref( Mod( Minute(), 5), 1)=0;  {эти условия позволяют игнорировать сигналы на барах, имеющих кол-во минут ненулевое и меньшее 5-ти}
Т.е. ТС будет учитывать только сигналы на "правильных" последнем и предпоследнем барах и игнорировать сигналы на этих барах при сбоях.
  
        
#2
ХХ:  Дим, давай настроим систему вместе.

- Давай, сейчас перерыв, время есть. На графике для проверки лучше сделать тайм-фрейм минутный, а в АД терминале нужно снять галочку с пункта 'Сервис-Параметры-Безопасность-Отключить подтверждение при вводе/снятии заявок'. Скажи, какой у тебя сейчас последний сигнал на графике и сколько баров до него, если считать справа?
ХХ:  Шесть, если с нулевым, т.е. на NumBarRight=5, сигнал Sell.
- Теперь в Sell-формуле советника в строке "FNull:=If(FSell, ExtFml("Borisoff.Move..." в параметре NumBarRight нужно вместо имеющегося значения прописать 8 или 9 и подождать пока этот бар станет 8-м от правого края, тогда сработает заявка и в АД-терминале появится окно подтверждения заявки (там нужно будет нажать отмену).
ХХ: В терминале появилось поручение на покупку, ничего не понимаю...
- У тебя в Sell-формуле неправильно написан вид ордера, надо вместо "B" написать "S"?... log-файл в Метастоковском каталоге появился?
ХХ:  Sell-заявка сработала, log-файл появился.
- Теперь также можно проверить срабатывание Buy-сигнала, тоже подсчитать бары до него и с плюс 1-2 бара прописать в Buy-формулу и подождать срабатывания заявки.
ХХ:  Все сигналы проверил, щас погоняю систему в онлайне. Вам объявляется огромная благодарность! ... Всё проверил, всё работает и кэш тоже, огромное спасибо :).

      
#3
ХХ:  Дим, если сигнал на графике нарисовался заявка должна исполняться?

- Не всегда. Я например на графиках, созданных в часовом тайм-фрейме, не видел появления ни одной заявки в течении нескольких дней, хотя сигналы на графиках рисовались. Не знаю, что этому причина, но, если бумагу создавать в Мете в минутном тайм-фрейме, а затем сжимать график в часовой или другой тайм-фрейм, то все работает нормально. Поэтому сейчас я всем рекомендую для авто-трейдинга создавать в Метастоке 'Security' c минутным тайм-фреймом, а затем сжимать график кнопкой 'Periodicity' до нужного тайм-фрейма.

      
#4
ХХ:  Привет! Я так понял инструмент в параметрах не задается ... можно ли по сигналу одновременно чтобы сделки проходили на ММВБ и ФОРТСе?
(Сейчас можно, смотри Раздел 39)
- Это можно сделать, хотя библиотека считывает тикеры с графика, просто нужно иметь два разных графика. Затем нужно создать в Indicator Builder'е индикаторы с копиями формул Советника для ММВБ, в этих индикаторах для получения данных нужно использовать функцию Security("Ticker", ), чтобы эти индикаторы в Советнике на ФОРТС использовали данные не со своего ФОРТС-графика, а с графика ММВБ. Далее в формулах Советника на Фортс нужно прописать вызовы этих индикаторов с помощью функции Fml("{название индикатора}"), и тогда оба Советника будут использовать сигналы только ММВБ-инструмента, но посылать сигналы будут с одного графика на ММВБ, а с другого на ФОРТС.
  Можно также работать одним инструментом одновременно на разных тайм-фреймах с помощью создания Chart-копии с основного Security-графика (Chart-график можно создать через меню File-New-Chart и далее в списке ЦБ выбрать тикер нужного инструмента. К Chart-графику также можно прикреплять советников и менять у него тайм-фрейм). Т.е. получится что Security-график будет работать, например, с ММВБ в одном тайм-фрейме, а Chart-график того же инструмента будет работать с ММВБ с другим тайм-фреймом, и оба графика будут управляться одним и тем же советником.           
ХХ:  Я так и подумал :((  Просто на одном графике может быть сигнал, а на другом нет.
- Если ты хочешь открывать позиции на ФОРТС по сигналам с графика ММВБ, то можно воспользоваться функцией SECURITY(), т.е. считывать в советник на ФОРТС-графике ценовые данные с ММВБ-графика и обрабатывать их в нем, и при появлении сигналов от данных ММВБ-инструмента открывать позиции на ФОРТС и наоборот.
ХХ:  Ааа... как все интересно :)
- Просто помести советника для ММВБ на график ФОРТС-инструмента, но замени в нем значения 'Close' и др. значением: SECURITY("тикер ММВБ", Close)
ХХ:  И два графика одновременно запустить?
- Да вроде бы не обязательно, данные и без графика будут считываться, если такая бумага есть в Метастоке.

      
#5
ХХ:  Дим, а у тебя модуль сколько раз и с каким интервалом пытается заявку выставить ?
- Это зависит от заданного времени контроля исполнения заявки. При первом появлении сигнала в Метастоке вызывается модуль, который пытается выставить заявку, при этом происходит следующее:
 Данные в Мете продолжают обновляться и происходят новые вызовы модуля по тому же сигналу, но модуль, который запустился первым в момент появления сигнала в Мете, не разрешает последующим модулям (по той же бумаге, рынку и портфелю) продолжать работу и они завершаются без формирования заявки в АД.
Стартовавший первым модуль посылает серверу запросы на лимиты и на имеющиеся позиции по инструменту, потом посылает в АД заявку, а затем запускает цикл ожидания исполнения этой заявки путем ожидания изменения позиций в портфеле. Если заявка исполняется, то позиция в портфеле соответственно меняется, увеличивается или уменьшается, а модуль это изменение видит и завершает работу с записью информации в лог-файл о результатах своей работы. Если позиция в портфеле не изменяется по окончании времени контроля исполнения, то текущая заявка удаляется из очереди заявок, а модуль также завершает работу с записью инфы в лог-файл.
Длительность времени контроля исполнения заявки можно задать в cfg-файле. У меня это время было равно 120 сек, но я думаю, при работе с минутными барами, лучше сделать его меньше одной минуты, тогда, при наличии сигнала, модуль из Метастока успеет вызваться и второй раз на том же баре, если первый раз заявка не исполнилась. Вот так это работает.         
ХХ: Я не об этом... ты сейчас описал контроль на прикладном уровне ... а ошибка была на транспортном (нет отклика сервера)... на транспортном в случае ошибки надо делать несколько попыток с некоторым интервалом времени. Транспортная проблема - самая популярная, но чаще всего она кратковременная.

- Я тоже это понял. Поскольку я работал на минутных барах, а время контроля у меня было задано 120 сек, то при сбое на транспортном уровне модуль все равно ждал две минуты исполнения заявки и не давал стартовать другим модулям по сигналу на этом и последующих барах, пока не истекли эти две минуты. А теперь я задам в cfg-файле время контроля меньшим одной минуты и при кратковременных сбоях на транспортном уровне вызванный первым модуль быстрее завершит свою работу и даст возможность другим модулям попытаться сформировать заявку еще несколько раз на том же или последующем барах. Например, при значениях в cfg-файле, равных 22, при возникновении транспортных сбоев канала связи модуль будет вызван повторно для формирования заявки на минутном баре минимум три раза (60/22=~3).
   

#6
ХХ:  Дим, робот гепы плохо торгует, входит на следующем баре. Приходится руками позицию открывать, а если бы на самом гэпе входил, результаты были бы лучше.
- Напиши формулу определения гэпа и условие открытия позиции в нем, и при NumBarRight=0 робот будет позиции не по барам открывать, а на текущей движухе.
ХХ:  Дим, такие гепы довольно редки. проще руками позицию открыть...хотя есть мысль как геп выловить, соотв. это будет новый символ EnterGap наверно.
- Да, в Советнике добавятся условия UpGap:=If(..., True, False) (или DownGap) и OpenPosUp:=If(UpGap AND ..., True, False) и добавится еще одна строка с вызовом функции MoveFORTS() с параметром NumBarRight=0:
FNull:=If( UpGap And OpenPosUp, ExtFml("Borisoff.MoveFORTS",................ ,0), False);
ХХ:  Ага... надо подумать... есть нюансы.

       
#7
ХХ:  Я не понял, что такое библиотека и что такое модуль, и что каждый из них делает?
- Библиотека - это файл с дополнительными функциями к Метастоку, позволяющими запускать внешнее приложение по сигналам с графиков Метастока.
- Модуль - это файл внешнего приложения, формирующий заявки в АД-терминал по сигналам из Метастока и контролирующий их исполнение.

     
#8
ХХХ:  Мне не совсем понятен механизм работы модуля, поскольку программером я не являюсь.
- попробую описать поподробнее, что именно делает модуль:
                         
  Модуль запускается из Метастока при появлении сигнала на графике, если срабатывает вызов внешней функции "Borisoff.Move...".
Стартовавший модуль в первую очередь блокирует запуск последующих модулей ПО ТОМУ ЖЕ сигналу в Метастоке. Далее стартовавший модуль проверяет переданные ему из Метастока параметры и пытается выполнить заданные в параметрах команды.Он ищет вначале возможные блокировки, START, STOP, LOCK* файлы, команды вывода портфелей в кеш, удаленного завершения работы терминала и т.д. Если модулю была передана Buy или Sell заявка, то модуль в соответствиии с ней вначале проверяет текущие позиции по рынку, портфелю и инструменту (далее для краткости "Р-П-И") которые ему были переданы в параметрах. Если позиций в портфеле нет, то модуль очищает очередь заявок от всех имеющихся там активных заявок, стопов и т.д. по Р-П-И (заявки других Р-П-И не трогает). затем посылает в АД заданную ему заявку и включает КОНТРОЛЬ ЕЕ ИСПОЛНЕНИЯ. В ТЕЧЕНИИ ВРЕМЕНИ КОНТРОЛЯ ИСПОЛНЕНИЯ модуль переодически делает запросы в АД-терминал, проверяя изменились ли ПОЗИЦИИ в портфеле по заданному Р-П-И, т.е. контролируя исполнение заявки. Если по окончании времени контроля исполнения позиции в портфеле не изменились и статус заявки не стал равен значению "ИСПОЛНЕНА", то очередь заявок по данному Р-П-И опять очищается и модуль завершает работу с сообщением, что заявка не исполнена. Если заявка принята к исполнению, и исполнена, то затем подается заявка на постановку стопов, если они были указаны.   Операция установки стопов также контролируется модулем. При исполнении заявок и стопов модуль ведет контроль исполнения в течении времени, заданного в MoveOrder.cfg файле. Если все прошло нормально, то модуль завершает свою работу раньше времени контроля исполнения. Если происходят какие-то задержки или сбои, то модуль ждет истечения заданного времени и затем завершает работу с записью результатов исполнения в лог-файл. Если старт закончился неудачно и заявка по каким-то причинам не исполнена, то при следующем обновлении данных в Метастоке, по тому же сигналу на графике, снова стартует модуль и снова пытается исполнить заданную заявку. Модуль опять вначале сверяет заданные ему параметры и имеющиеся в терминале позиции по Р-П-И. Если заданная позиция по бумаге в заданном размере уже есть в портфеле, то модуль просто завершает свою работу не выполняя никаких действий, если позиция в портфеле все еще меньше заданной, то модуль подает заявку на недостающий объем. По каждому Р-П-И может одновременно запускаться несколько модулей, занимающихся каждый своей заявкой и своим Р-П-И.
Теперь представим, что у нас отсутствует контроль исполнения заявок и блокировка запуска нескольких модулей по одному и тому же Р-П-И-сигналу на графике в Метастоке. К чему это может привести? Отсутствие БЛОКИРОВКИ последующих вызовов модуля, приведет к тому что пока один модуль уже работает с заявкой, по этому же сигналу в Метастоке, при очередном обновлении данных графика, запустятся еще несколько модулей и каждый из них будет подавать свою заявку и у нас получится исполнение не одной заявки, а всех этих заявок сразу, что явно будет нежелательно и приведет к нарушению лимитов на размер этого инструмента в портфеле и другим сбоям.
Отсутствие КОНТРОЛЯ ИСПОЛНЕНИЯ приведет к таким же последствиям, что и отсутствие блокировки, так как модуль в этом случае после подачи заявки в АД не стал бы дожидаться обновления позиций в АД-терминале и завершил бы работу. А поскольку подача заявок происходит гораздо быстрее, чем обновление информации в АД-терминале о текущих позициях, то модуль стартовавший следующим ЕЩЕ не "увидит" никаких изменений в портфеле АД-терминала, потому что их еще не будет, и тоже подаст свою заявку. И следующий модуль также подаст новую заявку, т.к. на графике в Метастоке сигнал будет активным при каждом очередном обновлении данных.
И пока пройдет время и принятые заявки и изменения в позициях отобразятся в АД-терминале, уже будет исполнено явно "лишнее" кол-во заявок. То есть получается, что для корректной авто-торговли необходим и КОНТРОЛЬ ИСПОЛНЕНИЯ заявок каждым модулем и БЛОКИРОВКА старта других модулей по тому же Р-П-И-сигналу, чтобы в портфеле не нарушались лимиты по заданным долям бумаг.
         
     
#9     
ХХХ:  В какой момент модуль начинает работать? с формирования первой заявки, то бишь вызова функции?.
- модуль просто находится в каталоге и запускается из Метастока при появлении сигнала на графике и после обработки этого сигнала завершает работу. При новом сигнале модуль запустится снова.
       
          
#10
ХХХ:  Буквально несколько минут назад я заново подключился, тут же сформировалась заявка, это значит что модуль заработал? Однако в диспетчере задач в числе выполняемых приложений экзешник MoveОrderADirect отсутствует. И если формируются заявки, то почему MoveOrderADirect не отражается в диспетчере?
- модуль сформировал поданную из Метастока заявку, проконтролировал исполнение и завершил работу. Все прошло очень быстро, поэтому вы и не видите модуль в диспетчере задач.
     
            
#11
ХХХ:  Затык возникает тогда когда модуль появляется в диспетчере и комп существенно "подвисает".
- модуль обычно бывает виден в Диспетчере Задач, если заявка по каким-то причинам сразу не исполняется, поэтому модуль продолжает оставаться в памяти,
делая запросы о позициях в АД-терминал, пока не истечет время контроля исполнения. По истечении времени контроля модуль сам завершает работу. Вы можете уменьшить  или увеличить время контроля исполнения c помощью файла MoveOrder.cfg.
Почему у вас происходит сильный рост загрузки ЦП, когда заявка сразу не исполняется и модуль начинает ждать ее исполнения, я сказать не могу, ведь модуль при этом не делает никакой работы, кроме простого цикла с запросом текущих позиций в АД-терминал. Возможно что-то не так в настройках служб или других программ на вашем компьютере, потому что например на моих компьютерах ни c AMD-процессором, ни с Intel-процессором такой проблемы нет и загрузка модулем ЦП обычно бывает не выше 15%, если смотреть в Диспетчере задач. Попробуйте использовать в Метастоке не сами Security, а на Chart'ы и Layout'ы на основе Security, а также используйте рекомендации, приведённые в конце раздела 16 на этом сайте.
    
                
#12

Х_:  При выставлении заявки система ждет очередной сделки, хотя в формуле используется цена закрытия. На золоте вечером может и все пять минут прождать, так и не подав заявку.
- Сама цена не влияет на подачу заявки. Чтобы заявка подавалась нужно два условия:
1) наличие Buy или Sell сигнала на графике
2) чтобы этот сигнал был на баре, равном NumBarRight от правого края графика
   Если хотите, чтобы заявки срабатывали СРАЗУ ЖЕ, как только на графике появляется сигнал, нужно задавать NumBarRight=0 (т.е. это крайний правый, еще формирующийся бар на графике). А если указывать любое значение NumBarRight > 0, то сигналы будут срабатывать только НА УЖЕ ОКОНЧАТЕЛЬНО СФОРМИРОВАННЫХ БАРАХ.
    
       
#13
ХX_:  Мой советник в Expert Advisor прекрасно генерирует сигналы, но как только прошёл сигнал Sell, то на каждой последующей свечке выбранного интервала генерируется этот же сигнал продажи. И наоборот, если прошёл сигнал Buy, далее на каждой свечке идёт генерация покупки. Может быть это хорошо для увеличения позиции, а если я желаю торговать определённым лотом. Как на это будет реагировать робот? Как избавиться от постоянно чередующихся одинаковых сигналов?
- Если будете торговать лотом только одного размера, то после первого сигнала и первого формирования позиции никакие последующие сигналы на размер позиции уже не будут влиять, ведь заданная позиция уже будет присутствовать в портфеле, т.е. можно все оставить как есть.  При новых сигналах позиция увеличиваться не будет, если она задана постоянной величиной, например значениями, "-1" или "-500" или "-25*Lot". Позиция при новых сигналах может изменяться, только если при новых сигналах также будет меняться и ее размер в формулах вызова функции "Borisoff.Move...", т.е. в параметр размера позиции будет подставляться не константа, а переменная. Кроме того, выставление заявок идет не по всем сигналам на графике, а только на баре, равном NumBarRight значению от правого края. Чтобы избавиться от чередующихся одинаковых сигналов после первого Buy или Sell сигнала надо добавлять в Buy и Sell формулы дополнительные условия, или например применить функцию Cross, если хотите чтобы на графике рисовался только самый первый из сигналов Buy или Sell тренда.

            
#14
ХXX:  При использовании RJ-пирамидинга, после срабатывания стопов, в каталоге остается файл "RJ...", мешающий начать RJ-пирамидинг заново. Приходится удалять вручную или ждать пока цена изменится так, чтобы RJ-пирамидинг возобновился сам. Также на ФОРТС, если при превышении лимитов очередная заявка из-за этого не исполняется, то удаляются также все имеющиеся стопы по бумаге.
- Все замечания устранены: при выходе по стопу и обнулении позиций по инструменту в портфеле, "RJ..."-файлы автоматически удаляются и RJ-пирамидинг возобновляется с текущих уровней, также поправлена работа со стопами.

            
#15
Х:  У меня есть к Вам просьба о помощи: моё желание, чтобы закрывалась длинная позиция после того, как цена фьючерса увеличилась на N-нное количество пунктов (или %) от цены покупки, аналогично закрытие короткой позиции, при уменьшение цены фьючерса на N-нное количество пунктов(или %) от цены продажи.  Например: прошёл сигнал  EnterLong. Робот купил 1 лот (с учётом проскальзывания) по цене 65000. После покупки робот должен сразу выставить заявку на продажу 1 лота по цене 65500.
  Вариант 1.  Движение цены в сторону открытой позиции и заявка на продажу исполнилась. CloseLong сработал.
  Вариант 2.  Движение цены в обратную сторону, т.е. робот выставил заявку на закрытие длинной позиции по 65500, но цена развернулась и через какой-то интервал времени появляется сигнал  EnterShort по цене 64500. В этом случае открывается короткая позиция, робот должен аннулировать предыдущую заявку на закрытие длинной позиции по 65500 и выставить новую заявку на закрытие короткой позиции по цене 64000. Возможно ли так сделать - не знаю.
Если есть возможность помочь - заранее благодарю.
  
- Насчет анулирования заявок, это делается автоматически, т.е. при создании позиции противоположного направления имеющиеся активные заявки и стопы для того же инструмента автоматически удаляются.
- Я
прикидывал разные варианты того, как реализовать фиксацию профита, сейчас для этого появились очень удобные BuyScalp и SellScalp заявки. Также можно попробовать такой вариант - использовать авто-перемещаемые по тренду ASimple-стопы:
                   
 
{Пример для лонга}
  FBuy:=({Здесь прописываются Ваши формулы открытия BUY-позиции без фигурных скобок});
  FPos:=-1;
  FixLong:= LastValue(500/Close*100+0.1); {расчет для лонга %процента стопа для фиксации профита в 500 пунктов от последней Close-цены и плюс проскальзывание, равное %размещения стопа ниже цены созданной лонг-позиции}
  FNull:=IF(FBuy OR Cum(1)=LastValue(Cum(1)), ExtFml("Borisoff.MoveFORTS", "1234-000", FPos, 0.05, B, 0.1, ASimple, FixLong, FBuy, 0), False);
  {т.е. получается, после создания Лонг-позиции к ней создастся авто-перемещаемый стоп, размещенный на 0.1% ниже Close-цены создания лонг-позиции,}
  {если затем цена бумаги уходит вверх на FixLong% величину, то стоп автоматически перемещается вверх на эту же самую FixLong% величину}
  {и при обратном движении цены вниз зафиксируется профит по этому краткосрочному лонгу, примерно равный нужной величине. Если же цена вверх не пойдет, то убытки ограничатся теми же ~0.1% на уровне на котором был первоначально поставлен стоп}
    
 
{Пример для шорта}
 
FixShort:= LastValue(500/Close*100+0.1); {расчет для шорта %процента стопа для фиксации профита в 500 пунктов от последней Close-цены и плюс проскальзывание, равное %размещения стопа выше цены созданной шорт-позиции}
  FNull:=IF(FSell  OR Cum(1)=LastValue(Cum(1)), ExtFml("Borisoff.MoveFORTS", "1234-000", FPos, 0.05, S, 0.1, ASimple, FixShort, FSell, 0), False);
  {т.е. получается, после создания Шорт-позиции к ней создастся авто-перемещаемый стоп, размещенный на 0.1% выше Close-цены создания шорт-позиции,}
  {если затем цена бумаги уходит вниз на FixShort% величину, то стоп автоматически перемещается вниз на эту же самую FixShort% величину}
  {и при обратном движении цены вверх зафиксируется профит по этому краткосрочному шорту, примерно равный нужной величине. Если же цена вниз не пойдет, то убытки ограничатся теми же ~0.1% на уровне на которым был первоначально поставлен стоп}
            
Х: Спасибо за ответ, но немного не то. С простыми стопами мне понятно. Вот пример вчерашней торговли на графике фьючерса РТС: сигнал на открытие короткой позиции я получил на свечке от 19.03.2009 в 22.00 по цене закрытия свечки 67775. С учётом проскальзывания я вошёл (вручную) в шорт по цене 67795 на свечке в 23.00. Сразу поставил (вручную) лимитированную заявку купить по цене 67295, которая сработала 20.03.2009 на свечке в 13.00. При этом мтс до 20.03.2009 на 19.00 часов не изменила сигнала на противоположный. Простые стопы уже на свечке 19.03.2009 в 23.00 часа закрыли бы позицию с убытком. Наверно понятно, что я хотел бы. Но как этого добиться, прописать в мтс и роботе, не знаю.
                 
-
Можно было сделать, с помощью дополнительных формул, автоматическое возобновление позиции после срабатывания стопа. Но если такой вариант не устраивает, то можно попробовать сделать так:
              
{Для ШОРТА}
                              
{по сигналу открываем шорт-позицию}
FSell:={ваша формула Sell-сигнала}
{поскольку нам возможно придется зафиксировать профит не только на том же баре сигналом, но и несколько баров спустя, поэтому запомним Close-цену
открытия шорт-позиции}
SellClose:=ValueWhen(1,FSell,Close);
{С учетом того, что открываем шорт на следующем баре по Close-цене закрытия текущего бара, то NumBarRight=1}
NumBarRight:=1;
{размер позиции, например 1 контракт}
FPos:=-1;
{далее рассчитываем в %, что нам надо зафиксировать прибыль по шорту через 500 пунктов после его открытия + %проскальзывания}
FPercentProfit:=500 /SellClose *100 + 0.15;
{вводим условие фиксации профита по шорту, т.е. проверяем, что текущая Close-цена на последнем баре ушла ниже цены фиксации профита по шорту}
FixSellProfit:=( (SellClose - LastValue(Close)) /SellClose *100 );
{уточняем Sell-сигнал, т.е. разрешаем Sell-сигналу быть активным, если НЕ наступило условие фиксации прибыли по шорту и если текущая Close-цена на последнем баре ниже SellClose-цены на величину не более двойного проскальзывания (для защиты от повторного открытия Sell-позиции сразу же после фиксации профита по шорту!!!)}
FSellOrder:=if( FSell AND (FixSellProfit < FPercentProfit) AND (FixSellProfit <= (2 *0.15)), True, False);
{формируем Sell-заявку, если есть Sell-сигнал}
FNull:=IF( FSellOrder, ExtFml("Borisoff.MoveFORTS","1234-000", FPos, 0.15, S, 0, Simple, 0, FSellOrder, NumBarRight), False);
{если условие фиксации прибыли по шорту наступило, то закрываем шорт задавая нулевой размер позиции}
FixShort:=if( FSell AND (FixSellProfit >= FPercentProfit), True, False);
FNull:=IF( FixShort, ExtFml("Borisoff.MoveFORTS","1234-000", 0, 0.15, S, 0, Simple, 0, FixShort, 0), False);
{рисуем Sell-сигнал на графике если нужно}
FSell;
   
{Для ЛОНГА}
                               
{по сигналу открываем лонг-позицию}
FBuy:={ваша формула Buy-сигнала}
{поскольку нам возможно придется зафиксировать профит не только на том же баре сигналом, но и несколько баров спустя, поэтому запомним Close-цену
открытия лонг-позиции}
BuyClose:=ValueWhen(1,FBuy,Close);
{С учетом того, что открываем лонг на следующем баре по Close-цене закрытия текущего бара, то NumBarRight=1}
NumBarRight:=1;
{размер позиции, например 1 контракт}
FPos:=-1;
{далее рассчитываем в %, что нам надо зафиксировать прибыль по лонгу через 500 пунктов после его открытия + %проскальзывания}
FPercentProfit:=500 /BuyClose *100 + 0.15;
{вводим условие фиксации профита по лонгу, т.е. проверяем, что текущая Close-цена на последнем баре ушла выше цены фиксации профита по лонгу}
FixBuyProfit:=( (LastValue(Close) - BuyClose) /BuyClose *100 );
{уточняем Buy-сигнал, т.е. разрешаем Buy-сигналу быть активным, если НЕ наступило условие фиксации прибыли по лонгу и если текущая Close-цена на последнем баре выше BuyClose-цены на величину не более двойного проскальзывания (для защиты от повторного открытия Buy-позиции сразу же после фиксации профита по лонгу!!!)}
FBuyOrder:=if( FBuy AND (FixBuyProfit < FPercentProfit) AND (FixBuyProfit <= (2 *0.15)), True, False);
{формируем Buy-заявку, если есть Buy-сигнал}
FNull:=IF( FBuyOrder, ExtFml("Borisoff.MoveFORTS","1234-000", FPos, 0.15, B, 0, Simple, 0, FBuyOrder, NumBarRight), False);
{если условие фиксации прибыли по лонгу наступило, то закрываем лонг задавая нулевой размер позиции}
FixLong:=if( FBuy AND (FixBuyProfit >= FPercentProfit), True, False);
FNull:=IF( FixLong, ExtFml("Borisoff.MoveFORTS","1234-000", 0, 0.15, B, 0, Simple, 0, FixLong, 0), False);
{рисуем Buy-сигнал на графике если нужно}
FBuy;
                    
                  

Есть еще один вариант, использовать одноразовые OneBuy OneSell заявки (см.раздел 31) или SimpLock-стоп (см.раздел 15).
Также очень хороший вариант - использовать авто-переставляемый ASimple-стоп, с его возобновлением после срабатывания, тогда после срабаытвания стоп может возобновиться на новом уровне и не только отыграть начальные потери, но и получить профит на заданном ценовом уровне.
     
Но лучше всего для такой стратегии применить недавно появившиеся SCALP-заявки (раздел 34), в которых размер убытка можно задать например -30% и тогда позиция скорее всего всегда закроется по заданному уровню профита.
     
Вообще
советую ВСЕГДА предварительно ПРОВЕРЯТЬ прежде чем применять в работе, как выглядит на графике КАЖДАЯ переменная и КАЖДАЯ строка из разрабатываемых вами формул (
!).          

          
#16
ХXXX: Дмитрий ,здравствуйте. Изучаю ваш модуль автоторговли. Возникли несколько вопросов по подаче модулем заявок ,если не затруднит поясните пожалуйста...
Открыт шорт ,позиция шорта по портфелю 1 лот. Хочу добиться от модуля по сигналу (выход из шорта) подачи заявки на покрывающую покупку 1 лота(выход в кеш).
В советнике на подачу заявки прописал следующую формулу :

                               
  FNull:=If(FExitBuy,ExtFml("Borisoff.MoveFORTS","0000-000",0,0.1,В,0,Simple,0, FExitBuy,0),False);

                                       
Сигнал FExitBuy в метастоке отображается корректно, по условию заявки 0-размер доли в портфеле указан, проскальзывание 0.1%, купить, без стопов, на текущем баре. Должна быть подана заявка на покупку позиций портфеля находящихся в шорте, т.е. покупка 1 лота с проскальзыванием 0,1% , но позиция не закрывается. Изменение же лота на -1 выдает заявку на покупку 2 лотов. Подскажите правильное содержание поручения на закрытие шорта с проскальзыванием 0,1%, закрываются все шорт позиции по бумаге, в лонг позиции не открываются.
                 
-
Для выхода ИЗ ШОРТА формула будет такой:
                                
     FNull:=If(FExitBuy,ExtFml("Borisoff.MoveFORTS","0000-000", 0, 0.1, S, 0,Simple,0,FExitBuy,0),False);
                                                                                      ^         ^
                                                                                      |          | 

                
т.е. для выхода из шорта (Sell-позиции) должна использоваться не BUY, а SELL-заявка с НУЛЕВЫМ размером позиции. У меня в РАЗДЕЛЕ 4, в пояснениях к примерам эта информация выделена малиновым цветом. В моем модуле предусмотрена автоматическая коррекция позиции, если она по какой-то причине превышает заданный в формулах советника размер. Именно на этом свойстве сделан выход из имеющейся позиции. Т.е. если задать в формуле нулевой размер позиции для заявки ТОГО ЖЕ НАПРАВЛЕНИЯ, что и имеющаяся в портфеле позиция (т.е. Sell-заявка для Sell-позиции), то модуль автоматически посылает в терминал заявку на УМЕНЬШЕНИЕ имеющейся позиции до нуля. А Buy-заявка с нулевым размером для закрытия шорта не сработает, поскольку в портфеле нет Buy-позиций, поэтому модулю уменьшать будет нечего.

(с v.58 позиции закрываются при подаче заявки любого направления с указанием нулевого размера позиции)

         
#17
ХX_:  Хотел спросить, реализована ли продажа по рыночной цене в Вашем модуле. Из описания не увидел, где можно на фортс выставить рыночную цену с выбранным отступом от цены. И можно ли быстро снять остаток заявки и выставить остаток заново?

- Это делается с помощью задания соответствующей величины проскальзывания: если задать эту величину достаточно большой, то получится мгновенное исполнение по лучшей встречной рыночной цене, если же задать проскальзывание небольшим или даже отрицательным, то соответственно заявка будет ожидать исполнения по заданной цене.
- Остаток заявки снимается автоматически, если заявка за время контроля исполнения не успела исполниться полностью, и сразу автоматически подается новая заявка на оставшуюся часть, при этом параметры новой заявки будут автоматически перерасчитаны с учетом изменения последней цены по бумаге. Время контроля исполнения вы можете определять сами в конфигурационном MoveOrder.cfg файле.

        
#18
Х_X_:  Дмитрий! Последняя строчка лога смущает!
" Сбой в подаче заявки на Покупку 1 шт SBER3 по цене 35,00р; N=35132254; ResultСreateBuyOrder-Операция выполнена успешно!": 

- Эта фраза пишется в случае, если заявка была принята терминалом к исполнению, но по окончании времени контроля исполнения не получила статус "исполнена". Такое может быть даже в случае, если заявка просто не сработала из-за того, что заданная для нее цена не успела за изменением биржевой цены. Сбойная (вернее не исполненная) заявка по окончании времени контроля исполнения удаляется. В последних версиях это сообщение также пишется даже в том случае, если заявка принята терминалом и исполнена, но  п о з и ц и и  в терминале по окончании времени контроля исполнения  н е  о б н о в л е н ы.

       
#19
ХXX_:  Дмитрий добрый день/вечер. Зачитал до дыр пособие, но все таки не понял как правильно поставить авто-стоп. Не очень понимаю куда его прописывать. Задача такая: как только появился сигнал и исполнилась заявка на покупку, нужно сразу же поставить заявку с автопереставляемым стопом. Можно привести какой-то пример?

- Стоп прописывается в Советнике в Метастоке, в параметрах функции 'ExtFml("Borisoff.Move...'. Вот примеры строк, из моих ТС, прописываемых в Советнике Метастока (в примере выбран ASimple-стоп, т.е. авто-переставление простого Simple-стопа):
    
{на продажу}
FNull:=If(FSell OR LastValue(Cum(1))=Cum(1),
ExtFml("Borisoff.MoveFORTS", "12345-000", -1, 0.25, S, FStop, ASimple, 0.01, FSell, 1), False);
     
{на покупку}
FNull:=If(FBuy OR LastValue(Cum(1))=Cum(1),
ExtFml("Borisoff.MoveFORTS", "12345-000", -1, 0.25, B, FStop, ASimple, 0.01, FBuy, 1), False);
     
Обратите внимание, что для работы с авто-стопом в строку  о б я з а т е л ь н о  добавляется условие:  ' OR LastValue(Cum(1))=Cum(1) '
позволяющее работать с авто-стопом при отсутствии Buy/Sell-сигналов на графике, а только при обновлении данных графика. Для работы с авто-стопом применяются параметры: ' FStop, ASimple, 0.01 ' т.е. величина размещения стопа 'FStop' (в %) от последней Close-цены, вид авто-стопа 'ASimple' и процент изменения текущей цены, при котором происходит очередное авто-переставление стопа по тренду '0.01%'. Стоп создается автоматически после создания основной Buy или Sell заявки и затем автопереставляется при обновлении данных в Метастоке и при каждом изменении последней цены по инструменту на 0.01% от цены на которой был поставлен стоп. Вот так вкратце. Поэкспериментируйте и научитесь, все довольно просто.

         
#20
_X:  Дмитрий, прочитал по диагонали описание подключения.. не понятно, это законченный продукт или требует ручной настройки? Есть ли какое-то полное пошаговое описание того, как запустить все Ваши модули?

- Это законченный продукт, просто он является частью авто-трейдингового комплекса, состоящего в целом из АД-терминала, программы Метасток и моих библиотеки и модуля. Библиотека и модуль связывают все эти части в единое целое, получают сигналы из Метастока и передают их в АД-терминал, контролируя их исполнение. Описание установки библиотеки и модуля в Метасток есть в разделе 2 на моем сайте. Чтобы всё это работало, вам нужно написать в Метастоковском Советнике торговые правила, определяющие получение Buy/Sell сигналов по данным графика, параметры стопов и прочее, а затем добавить строку передачи полученных параметров в мою библиотеку. Библиотека затем автоматически передаст все что нужно в модуль, который проконтролирует исполнение сигналов. Вот так вкратце. То есть вам нужно немного освоить написание торговых правил с помощью Советников Метастока. В Метастоке есть много готовых советников, вы можете посмотреть как они написаны, какие сигналы рисуют на графиках. Эти примеры помогут вам научиться создавать в Метастоке свои Торговые правила. После того как напишете свои правила в Метастоке можно будет подключать вашего советника к графику нужного инструмента и начинать автоматическую торговлю. Подключение производится с помощью всего одной строки 'ExtFml("Borisoff.MoveMICEX_SHR"....', примеров такой строки с разными видами заявок на моем сайте очень много.

          
#21
_XX:  С удивлением вчера обнаружил, что в dll отсутствует возможность подавать лимитированные заявки. Параметр "Price" судя по всему в dll отсутствует.
- Вы ошибаетесь, лимитированные заявки можно подавать. По формуле ЦенаЛимитЗаявки = Close +(-) %Проскальзывания, в реал-тайм можно задавать свою лимитированную Price-цену, где ЦЛЗ - нужная Вам Price-цена лимитированной заявки:
1. цена заявки рассчитывается модулем от Close-цены с учетом %проскальзывания.
2. Проскальзывание может быть положительным и отрицательным, соответственно ЦЛЗ может быть выше или ниже Close-цены для Buy-заявки (аналогично для Sell).
3. Чтобы получить вашу лимитированную Price-цену заявки задайте величину проскальзывания в % по формуле: (ЦЛЗ-Сlose)/Сlose*100 и передайте его функции (пропишите в параметрах).
4. Модуль по последней Close-цене и заданному +\- проскальзыванию сделает цену заявки равной ЦЛЗ.

     
#22
_XX: Добрый день! Не поможете мне разобраться почему у меня не получается управлять размером позиции как я хотел бы.
Идея простая - входить в позицию с объемом 1 лот, при наличии сигнала на предыдущих двух барах увеличивать до двух лотов, при отсутствии сигнала на текущем и предыдущих двух барах, сокращать позицию до 1 лота. Объем увеличивается по указанному условию, а вот сокращаться не хочет. В чем здесь может быть проблема?

- Проблема в том, что на текущем баре нет сигнала, из-за этого позиция не сокращается. Для сокращения позиции нужно
на баре с отсутствующим сигналом все-таки подать сигнал, для корректировки позиции.
Сделать это можно вводом дополнительного ТРЕНДОВОГО сигнала. В общем перепишите формулы так:
          
BuyTrend:=BarsSince(FBuy) < BarsSince(FSell); {т.е. если последний на графике Buy-сигнал, то это Buy-тренд. Не забудьте добавить перед этим условием в Советнике также формулы FBuy и FSell-сигналов.}
      
NumBarRight:=0;
   
FPos:= LastValue( If( Ref(FBuy,-2) AND Ref(FBuy,-1) AND FBuy, -2, -1) );
   
FLast:= LastValue(Cum(1))=Cum(1);
         
FNull:=If( FBuy OR BuyTrend,
ExtFml("Borisoff.MoveFORTS","12345-000",FPos,0.1,B,FStop,Simple,0,FBuy OR BuyTrend,NumBarRight),False);
   
FNull:=If( FLast,  {это условие выполняет ТОЛЬКО авто-перестановку Simple-стопа}
ExtFml("Borisoff.MoveFORTS","12345-000",-0,0.1,B,FStop,ASimple,0.001,False,0),False);
      
FBuy; {рисуем сигнал на графике}

         
#23
_XX: Дим, никак не могу прикрутить твою одно-лотовую версию в Эксперту в Мете .. (често говоря я просто не силен в программировании ) не понимаю что там и куда, просвяти плиз. В Метастоке есть готовый Советник который на графике уже сигналы выдает, но сигналы рисуются с опозданием, где-то на втором баре от правого края. Рынок ФОРТС. Файлы для автоматизации в нужный каталог скопировал. На вкладке Symbols есть строки Buy,Sell,ExitBuy, ExitSell:
- Вот эти строки добавь в свои Buy Sell ExitBuy ExitSell формулы Советника и пропиши свой номер портфеля на котором торгуешь и все заработает:

{Buy}

BuyOrder:= {этой логической переменной присвой результирующее значение Buy}
FPos:=-1; {размер позиции один контракт}
NumBar:=2; {бар на графике на котором появляется сигнал}

FNull:=If( BuyOrder,
ExtFml("Borisoff.MoveFORTS","00000-000",FPos,0.035, B, 0,Simple,0,BuyOrder,NumBar),False);
BuyOrder;

{Sell}

SellOrder:= {этой логической переменной присвой результирующее значение Sell}
FPos:=-1; {размер позиции один контракт}
NumBar:=2; {бар на графике на котором появляется сигнал}

FNull:=If( SellOrder,
ExtFml("Borisoff.MoveFORTS","00000-000",FPos,0.035, S, 0,Simple,0,SellOrder,NumBar),False);
SellOrder;

{ExitBuy}

ExitBuy:= {этой логической переменной присвой результирующее значение ExitBuy}
FPos:=-0; {размер позиции ноль контрактов}
NumBar:=2; {бар на графике на котором появляется сигнал}

FNull:=If( ExitBuy,
ExtFml("Borisoff.MoveFORTS","00000-000", -0, 0.035, B, 0,Simple,0,ExitBuy,NumBar),False);
ExitBuy;

{ExitSell}

ExitSell:= {этой логической переменной присвой результирующее значение ExitSell}
FPos:=-0; {размер позиции ноль контрактов}
NumBar:=2; {бар на графике на котором появляется сигнал}

FNull:=If( ExitSell,
ExtFml("Borisoff.MoveFORTS","00000-000", -0, 0.035, S, 0,Simple,0,ExitSell,NumBar),False);
ExitSell;

       
#24
_XXX: Дим, может я, конечно, не понял что-то. Но давай рассмотрим пример: у меня ШОРТ
бумаги, цена идёт вниз и у меня выскакивает сигнал на закрытие ЛОНГА. На твоём
сайте в разделе 4 написано. Я хочу закрыть BUY-позицию и поэтому пользуюсь FExitBuy с MaxQuantInPortfel = 0.
SELL-позицию я закрывать не хочу - цена идёт вниз, сигнал FExitSell не выскакивает и мне с шортом хорошо.
Мне кажется эта логика правильная. Если я не прав разъясни пожалуйста и подскажи как прописать, что бы
закрывался именно ЛОНГ или именно ШОРТ отдельно друг от дружки.

             
- На сайте приведены просто примеры команд (функций с параметрами), в реальной торговой системе нужно учитывать логику Ваших сигналов. Приведу пример на основе моей ТС. У меня в торговом Советнике используется 4 строки:
   
ExitBUY;
SELL;
ExitSELL;
BUY;
   
в которых прописаны следующие команды:

{для ExitBUY}
...
FBuy:= ...
FSell:= ...
ExitBuy:= ... {доп-условие определяющее выход именно из лонга}

OrderExitBuy := FBuy=False AND FSell=False AND ExitBuy;
FNull:=If( OrderExitBuy,
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.5,S,0,Simple,0,OrderExitBuy,NumBar),False);
OrderExitBuy;

{для SELL}
...
FSell:=...
SellOrder:=FSell;

FNull:=If( SellOrder,
ExtFml("Borisoff.MoveFORTS","12345-000",FPos,0.5,S,0,Simple,0,SellOrder,NumBar),False);
SellOrder;

 
{для ExitSELL}
...
FBuy:= ...
FSell:= ...
ExitSell:= ... {доп-условие определяющее выход именно из шорта}
OrderExitSell := FBuy=False AND FSell=False AND ExitSell;
 
FNull:=If( OrderExitSell,
ExtFml("Borisoff.MoveFORTS","12345-000",0,0.5,B,0,Simple,0,OrderExitSell,NumBar),False);
OrderExitSell;
          
{для BUY}
...
FBuy:= ...
BuyOrder := FBuy;

FNull:=If( BuyOrder,
ExtFml("Borisoff.MoveFORTS","12345-000",FPos,0.5,B,0,Simple,0,BuyOrder,NumBar),False);
BuyOrder;

          
И все работает как надо, нужные позиции в нужный момент открываются и закрываются.
Разберите этот пример и сделайте у себя аналогичную логику, чтобы и у Вас все работало как нужно.

       
#25

_X: Дим, глубоко еще не возился документацией - на выходных посижу, но с лёту не нашел такую вещь - как можно купить 10 контрактов ВНЕ ЗАВИСИМОСТИ от того, сколько уже в портфеле? в твоей dll третий параметр определяет ОБЩЕЕ кол-во бумаг, которое станет, а это не то, что хочется. Если ответ есть в доках, то так и скажи, сам найду))
Величина позиций зависит от каких-то условий рынка, эти условия описываются формулами, либо константой в Советнике в Метастоке и в соответствии с этими условиями заданные позиции будут сформированы автоматически. Т.е. нужно будет при каких-то условиях сформировать позицию на 10 контрактов больше чем уже есть в портфеле и как только эти условия наступят позиция автоматически увеличится на заданную величину. Т.е. например:
FPos:=-3; FPos := If( Условие2 = Истинно, -(Abs(FPos)+10), FPos );
_X: Ага, понял, спасибо. Если есть минутка, то последний вопрос (чтобы сегодня на вечерке поглядеть за роботенком): как ты получаешь текущий объем своих контрактов? Т.е. в твоем примере - FPos. Эта же переменная не глобальная для Меты и не передается при повторных вызовов dll?
В Метасток никак не получаю. Величину позиции контролирует модуль, стартовавший по сигналу в Метастоке, ему передается требуемая в данный момент величина позиций. Если величина имеющейся в АД-терминале позиции отличается от значения переданного модулю, то модуль САМ доводит позицию в АД-терминале до заданной.
_X: Модуль - это твоя dll? Ты передаешь дельту или само значение? (сейчас у меня 100 контрактов, дельта - 12 контрактов. ты передаешь модулю 100 или 12?)
Модуль это файл MoveOrderADirect_v58.exe, которому передается общее НУЖНОЕ число контрактов (112 для твоего примера).
_X: Вопрос по другому сформулирую: можно ли каким-либо способом (в мету или в DLL) получить ТЕКУЩЕЕ ЗНАЧЕНИЕ контрактов? Дим, если вопросы глупые и надо читать FAQ - так и скажи, не хочется тебя доставать по пустякам ))
Текущая позиция считывается модулем из терминала и сравнивается с переданной ему в параметрах.
_X: Ага, то есть, есть функция считывания объема позиции с терминала? вот это-то мне сейчас и нужно )) где найти пример?
эта функция пока недоступна трейдеру ни в Мете, ни в модуле, она как бы только "для служебного пользования" сделана.
_X: Дай мне ее! пожалуйста ))
даже я к ней доступа не имею :)
_X: Тогда не понимаю, как твой робот на ЛЧИ работал... где-то ведь надо хранить кол-во бумаг/контрактов. пусть даже в конфиг-файле или в логах?
Просто у меня немного другая логика управления позицией: т.е. какая величина позиции задается в Метастоке такая и поддерживается модулем. все просто. А кол-во хранится в самом АД-терминале :)
_X: Хранится в терминале, но робот, получается, не может получить эти данные...
Почему же ? Он их оттуда и получает.
_X: Что-то я тогда запутался. и как же можно получить эти данные?
:)) Их получает стартовавший по сигналу модуль, у него есть функция считывания текущих позиций из АД-терминала :))
_X: Давай сведем наш тезаурус )) Итак, мета (эксперт) выдала сигнал, стартует модуль, которому через DLL передаются параметры. Ты говоришь, что при выдаче сигнала (эксперта) модуль получает (может получить) кол-во контрактов, хранящихся в терминале. Так?
Да :)
_X: Тогда вопрос: как узнать какое кол-во контрактов получил (передано в) модуль? Пример: у меня в терминале хранится число - 100 контрактов, в присланном тобой примере есть параметр FPos, который каким-то образом равен числу контрактов: FPos:=-100; FPos := If( Условие2 = Истинно, -(Abs(FPos)+10), FPos ); Вопрос: каким образом можно FPos установить значение -100 (кол-во контрактов в терминале)? У меня сейчас в роботе все хранится в ячейках Excel, поэтому такие глупые вопросы и возникают ))
Узнавать ничего не надо т.к. ты же сам передаешь нужную позицию модулю т.е. уже знаешь какая величина позиций ТРЕБУЕТСЯ тебе в данный момент, поскольку она указана в Советнике в Метастоке константой или формулами.
_X: А есть возможность заполнить переменную FPos? в Excel я получаю с терминала: glS.MTS(i).curNum = glWB.Cells(curRow + i, 7).Value ' Текущее кол-во контрактов. Как мне заполнить FPos в Мете?
Эта переменная просто прописывается в Советнике! Ведь должен быть план торгов на день и каким кол-вом изначально планируется торговать. Это пишется в FPos. Если возможны изменения в величине позиций в течении дня, в зависимости от движения цен, то в Советнике эти условия предусматриваются заранее и описываются в формулах. И если условия для этих изменений в течении дня случаются то величина позиции в соответствиии с этими условиями меняется, вот и все. FPos:=-3; FPos := If( Условие2 = Истинно, -(Abs(FPos)+10), FPos ); FPos := If( Условие3 = Истинно, -(Abs(FPos)+Х), FPos ); FPos := If( Условие4 = Истинно, -(Abs(FPos)+Y), FPos ); Через эти условия-формулы можно как наращивать позиции, так и уменьшать или выходить в кэш.
_X: Вобщем придется для твоего привода перестраивать логику работы с позициями. у нас с тобой разные подходы )) интересно, а на ЛЧИ ты мог ежедневно править код советников для робота?
Конечно мог, ведь этот алгоритм прописывается в Советнике в Метастоке НА МОЕМ компьютере. Но этот алгоритм изменения величины позиции был заложен с самого начала, затем править его не было необходимости. И величина позиций во время торгов изменялась в соответствии с этим алгоритмом.
_X: Тупой вопрос: есть комп, на котором загрузили первый раз твой робот (мета+модуль+терминал) Fpos=0, робот работал весь день, FPos при закрытии был равным -100. Комп выключили. На следующее утро комп включили, загрузили терминал-мету-модуль. Сработал первый сигнал, чему будет равно значение FPos? ))
Это зависит от Сигналов в Советнике. Если утром в Метастоке появится новый сигнал изменяющий величину позиции, то позиция изменится и будет соответствовать этому сигналу, а если новых сигналов не появится или если в новых сигналах не изменится величина позиции, то позиция останется какой была (т.е.-100), до нового сигнала, меняющего позицию.
_X: Может в следующей версии ты сделаешь работу с конфигом, где можно было бы ручками задавать значение FPos при первой загрузке модуля? типа: RTSI-3.11 = -100 LKOH = -555 сейчас ты же считываешь данные из конфига.
"Конфигом" служит сам Советник! Именно в Советнике прописывается размер позиции и прочие нужные данные для той бумаги которой этот советник управляет.
_X: ok, ладно, спасибо за ответы, чужое мЫшление - это чужое )) подумаю на досуге, как подстроить привод под привычную мне логику работы МТС ))
ага, подумай, там просто :)


   
#26   
_XX : Дим, а если СТОП мне НЕ НУЖЕН, что задавать в строке?
Надо писать: 0, Simple, во всех строках (нулевое смещение для стопа и тип Simple, тогда стоп не будет создаваться). Вообще достаточно указать только нулевое смещение.
_XX: а тип стопа Simple убирать?
Тип стопа нельзя убрать, он выбирается из списка возможных значений, я обычно, если стопы не применяю, то выбираю тип Simple, главное задать НУЛЕВОЕ значение перед типом стопа, при нулевом значении никакой стоп не будет создаваться.
_XX: Дим, в строке для Buy указывается В, для Sell - S, а для выхода из позиций соответственно B/S только с нулевой позой?
Да, для выхода надо указать нулевую величину позиции, тип заявки неважен, лонг-позиция обнулится и при S и при B заявках, если в них указан нулевой размер позиции. Вообще для выхода желательно использовать тип заявки противоположный типу позиции, т.е. для выхода из лонга используем S-заявку с нулевым кол-вом, для выхода из шорта B-заявку с нулевым кол-вом.

      
#27
XXX: Привет. Блин робот не работает, экспорт в Мету есть, на графике сигнал на последнем баре есть, модуль не вызывается, лога нет.
Возможно exe-модуль неправильно назван, ... у тебя v58, а надо v59. Скачай заново с сайта, я сейчас там ссылку поправил, теперь будет скачиваться правильная версия exe-файла.
XXX: я так понял твой робот в любом случае отработает сигнал? если не было открытых ранее позиций.
Ага, если позиции, указанной в заявке нет, то эта позиция будет создана.
XXX: не очень хорошо... а можно только текущие работать? т.е. если появился сигнал, то сработать? чтобы старые не отрабатывать? Т.е.забыть про них совсем в любом случае, только на 0 баре и все.
Робот только текущие сигналы и исполняет, как только они появляются на указанном параметром NumBarRight баре, все сигналы расположенные НЕ НА заданном NumBarRight баре НЕ ИСПОЛНЯЮТСЯ в любом случае
XXX: даже если нет позиций?
В любом случае, в том числе и при отсутствии позиций
XXX: у меня почему-то отрабатывает
Такого не может быть, значит на нулевом баре есть и другие сигналы, которые возможно просто не отображаются у вас на графике
XXX: да нет, как-то странно, сигнал появился, он покупает и тут же продает зачем-то. он отрабатывает продажу, потом ее сразу выкупает и т.д. причем сигнала выкупать нет на этом баре, вот это меня просто в прострацию вводит. Робот на один сигнал пытается кучу сделок делать и лог постоянно пишет.
Значит так настроена торговая логика в вашем Советнике. Чего говорить попусту, пришлите мне полный текст всех строк вашего Советника и я скажу, что у вас не так.
XXX: У меня четыре условия: покупка, выход из покупки, продажа, выход из продажи:
это на покупку:
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FBuy:=If(BarsSince(a)<BarsSince(b),1,0);
FBuy>Ref(Fbuy,-1);
FNull:=If(FBuy, ExtFml("Borisoff.MoveMICEX_SHR","хххх-000",-1,0.5,B,1.05,Simple,0,FBuy,0), False);
это выход:
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FExitL:=If(BarsSince(a)<BarsSince(b),1,0);
FExitL<Ref(FExitL,-1);
FNull:=If(FExitL, ExtFml("Borisoff.MoveMICEX_SHR","хххх-000",-0,0.5,S,1.05,Simple,0,FExitL,0), False);
продажа:
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FSell:=If(BarsSince(a)<BarsSince(b),1,0);
FNull:=If(FSell, ExtFml("Borisoff.MoveMICEX_SHR","хххх-000",-1,0.5,S,1.05,Simple,0,FSell,0), False);
FSell<Ref(FSell,-1);
выход из продажи:
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FexitS:=If(BarsSince(a)<BarsSince(b),1,0);
FNull:=If(FExitS, ExtFml("Borisoff.MoveMICEX_SHR","ххх-000",-1,0.5,B,1.05,Simple,0,FExitS,0), False);
FExitS>Ref(FExitS,-1)
  
Ну я же и говорю, у вас ошибка в формулах! Кроме того логика выходов неверная, она дублирует логику входов, но наоборот. Поэтому у вас на нулевом баре одновременно подаются два сигнала: вход в позу и другой сигнал на выход из нее! Но Вы видите на графике только один из этих сигналов, потому что в Метастоке когда одновременно возникают несколько сигналов, то из них на одном и том же баре графика рисуется только тот сигнал, строка которого в Советнике расположена выше остальных условий на вкладке Symbols. Сейчас на вкладке Symbols своего Советника снимите галочки с обоих выходов из позиций, и все заработает как надо. Выходы из логики вашей ТС нужно убрать, т.к. они повторяют противоположные входы! Достаточно только Buy и Sell условий!
XXX: а как робот поймет что нужно закрывать?
Имеющиеся позиции при перевороте в противоположную сторону робот закроет автоматически. Т.е он знает, что при перевороте имеющуюся позицию надо закрыть, а потом уже он будет открывать позицию заданную сигналом. Также в ваших формулах есть ошибка: размер позиции в выходе должен быть нулевой, чтобы позиция обнулялась, иначе это не выход из позиций. Также не понятно, зачем вам в условиях выхода стопы, ведь позиция и так обнуляется.
Правильные формулы такие (порядок строк важен! все строки важны! нужный рынок и портфели задайте сами):
это на покупку:
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FBuy:=If(BarsSince(a)<BarsSince(b),1,0);
FBuy:=FBuy>Ref(Fbuy,-1);
FNull:=If(FBuy, ExtFml("Borisoff.MoveMICEX_SHR","хххх-000",-1,0.5,B,1.05,Simple,0,FBuy,0), False);
FBuy;
это выход из покупки (использовать не надо!):
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FExitL:=If(BarsSince(a)<BarsSince(b),1,0);
FExitL:=FExitL<Ref(FExitL,-1);
FNull:=If(FExitL, ExtFml("Borisoff.MoveMICEX_SHR","хххх-000",-0,0.5,S,0,Simple,0,FExitL,0), False);
FExitL;
продажа:
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FSell:=If(BarsSince(a)<BarsSince(b),1,0);
FSell:=FSell<Ref(FSell,-1);
FNull:=If(FSell, ExtFml("Borisoff.MoveMICEX_SHR","хххх-000",-1,0.5,S,1.05,Simple,0,FSell,0), False);
FSell;
выход из продажи (использовать не надо!):
a:=Mov(C,2,E)>Ref(Mov(C,2,E),-1);
b:=Mov(C,2,E)<Ref(Mov(C,2,E),-1);
FExitS:=If(BarsSince(a)<BarsSince(b),1,0);
FExitS:=FExitS>Ref(FExitS,-1);
FNull:=If(FExitS, ExtFml("Borisoff.MoveMICEX_SHR","ххх-000",-0,0.5,B,0,Simple,0,FExitS,0), False);
FExitS;
     
XXX: ок. потестирую. спасибо ...
Ну че, сейчас нормально крутится автомат?
XXX: пока нет сигнала ... так купил ... пока все правильно ... а что надо убрать чтобы не было стопа?
Ноль поставить перед типом стопа
XXX: вместо 1.05,Simple поставить 0,Simple так?
Ага
XXX: все работает:) спасибо тебе, помог :*)

     
#28

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

#29
XXX: Дим, а ты не пробовал дорабатывать алгоритм таким образом, чтобы в зависимости от эквити менялись некоторые условия для входа-выхода. Например, торгуемый сайз или автоматический переход на иной таймфрейм?
- Кстати, да, сайз менять МОЖНО в зависимости от эквити или других параметров! Я так и буду делать когда счет будет побольше. А тайм-фрейм как автоматически менять надо подумать.
ххх: Упирается все в возможности меты
- Покумекал, в общем в Мете тоже автоматом МОЖНО менять и ТАЙМ-фрейм! Надо просто иметь несколько портфелей, работающих с графиками разных тайм-фреймов, и автоматически стопить торговлю на одном портфеле и переходить на другой!!! :)))
ххх: Значения переменных в Мете нельзя оперативно менять.
- Можно! Я же меняю, надо использовать функцию LastValue() Она берет последнее (правое) значение и делает его константой. Я так у себя все переменные в константы преобразовываю.
ххх: Дим! это тема :))) спасибо за подсказку :))))))
- Спасибо и вам за идеи!!! Внедрю! :)

- Кстати прикинул, сейчас любой юзер также все это может реализовать, нужные функции и формулы в Метастоке сейчас имеются.
- Для изменения сайза можно пользоваться формулой: EAD:=ExtFml( "Borisoff.EquityAD", "12345-000", "FORTS" ); {считываем %эквити из АД терминала и используем в условии} Size:=LastValue( if( EAD < 3, -5, if( EAD < 5, -2 , -1 ) ) );
- А для изменения тайм-фрейма используем эту же формулу + StopStart заявки + нужное кол-во портфелей, и графики с советниками и нужными тайм-фреймами, ну и немного мозгов :)

#30
XX: Хотел вопрос задать, а почему вы так отвергаете альфовский робот (эксель)???
- Потому что у меня есть более удобный инструмент - Метасток.
хх: Но ведь через альфа эксель быстрее ведь?
- Наоборот, через Мету быстрее.

хх: Интересно....

#31
[ ХХХ ] : Слушай.. вопрос такой... в мете чтобы сделать робота... нужно какие то дополнительные библиотеки скачивать??
[ Дим ] : чтобы автоматизацию сделать т.е. связь между Метой и АД надо пару файлов с моего сайта скачать с Раздела 2 http://stockgraphics.narod.ru/autotrading_complex.htm
[ ХХХ ] : про завязку меты к аду это ясно... а чтобы заставить мету автоматически исполнять заявки при сигнале ТС ..то достаточно самой меты и знание языка меты??
[ Дим ] : в этих файлах содержатся три дополнительных функции для Меты для рынка ММВБ, ФОРТС и РТС стандарт. Когда файлы поставишь в каталоги Меты как в инструкции сказано, то эти функции появятся в Мете (будут доступны в индикаторах в списке стандартных функций Меты) И уже с помощью этих функций по сигналам из индикаторов МЕты (которые ты написал) будут формироваться заявки в АД с нужными параметрами, стопами и т.д
[ ХХХ ] : немного уже начал понимать что к чему...)
[ ХХХ ] : если я его за неделю успею собрать я тоже выйду в ЛЧИ ))
[ ХХХ ] : дай плиз ссыку именно на те файлы которые мне нужны...
[ Дим ] : Инструкция по установке http://stockgraphics.narod.ru/Razdel_2.htm прямые линки на файлы http://stockgraphics.narod.ru/Borisoff.dll http://stockgraphics.narod.ru/MoveOrderADirect3_v59.exe
[ ХХХ ] : почему для автотрейдинга желательна 11 -я версия меты?
[ Дим ] : там просто во внутридневном тайм-фрейме можно выбрать любое кол-во минут, т.е. не только 1 час, но любое больше значение. а так больше ничем

#32
[ ХХХ ] : Думаю для тебя будет легко ответить на мой вопрос такой:
  Какая формула у такой стратегии .. есть 2-е средние первая с периодом 30 .. вторая с периодом 10 ...
при пересечении второй первую снизу вверх лонг, а при пересечении сверху вниз шорт и сделать ее реверсивной

[ Дим ] : Авто-торгующий индикатор CrossMA будет такой:

MA30:=Mov(C,30,S);
MA10:=Mov(C,10,S);

FBuy:=Cross(MA10, MA30);
FSell:=Cross(MA30, MA10);

SellTrend:=BarsSince(FBuy)>BarsSince(FSell);
BuyTrend:=BarsSince(FBuy)<BarsSince(FSell);

FNull:=If(BuyTrend, ExtFml("Borisoff.MoveFORTS","хххх-000",-1,0.5, B,0,Simple,0,BuyTrend,0), False);

FNull:=If(SellTrend, ExtFml("Borisoff.MoveFORTS","хххх-000",-1,0.5, S,0,Simple,0,SellTrend,0), False);

False;

Полное описание примера: "Строим МТС на Метастоке за полчаса". http://www.russian-trader.ru/forums/entry.php?b=395

#33
[ ХХХ ] : Дим, помоги настроить управление позициями в портфеле.
Необходимо, чтобы на первом сигнале ставился 1 лот в портфеле
на втором сигнале добавлялось еще 2
на третьем сигнале добавлялось еще 5
на четвертом сигнале добавлялось еще 7 и так далее при покупке и продаже.
как это все прописать?

[ Дим ] : Чтобы такой алгоритм правильно работал вам нужно использовать дополнительную внешнюю библиотеку GV.dll (скачайте отсюда http://www.metastocktips.co.nz/gv.dll ) которая может сохранять значения глобальных переменных.

Из этой библиотеки нужны только две функции:
ExtFml( "GV.SetVar", Variable Name, Expression) – присвоить значение глобальной переменной.

ExtFml( "GV.GetVar", Variable Name) – получить значение глобальной переменной.
Где "GV.SetVar" и "GV.GetVar" названия функций соответственно на запись и считывание значений переменных, Variable Name - название глобальной переменной в которой сохраняется значение переменной из индикатора Метастока (имя глобальной переменной пишется в кавычках), и Expression - выражение или переменная в индикаторе Метастока.


Т.е. например текущую величину позиций из АД-терминала по акции Сбербанка запишем в глобальную переменную так: 
ExtFml( "GV.SetVar", "PosSBER3", LastValue(ExtFml( "Borisoff.PositionAD", "12345-000", " MICEX_SHR ", "SBER3" )) );

А считаем из глобальной GV-переменной в переменную vPos индикатора в Метастоке так:
vPos:=ExtFml( "GV.GetVar", "PosSBER3" ); 

Также описание работы с этой DLL приведено здесь http://denoy.ru/trejding/raznoe-o-trejdinge/vneshnyaya-biblioteka-gv-dll-dlya-metastoka-po-sledam-trejdera-pev-post-12/ и других сайтов с примерами в инете много. С помощью этой DLL вам нужно сохранять в глобальную переменную значение текущей позиции из АД-терминала пока нет сигнала на баре, а при появлении Buy или Sell сигнала нужно считать из этой переменной величину позиций, уменьшить её на единицу и подставить в строку подачи заявки в АД на изменение величины текущей позиции. После завершения бара с сигналом нужно сохранить в глобальной переменной новое значение текущей позиции из АД-терминала. Если на след баре появится новый сигнал на новое изменение позиции, то опять нужно считать из глобальной переменной текущую позицию и уменьшить её опять на 1 контракт и т.д. В общем чтобы всё работало, как задумано, нужно использовать GV.DLL библиотеку. Кол-во переменных в ней можно задавать неограниченное, т.е создать для каждого торгового инструмента свою глобальную переменную, например "PosSBER3.POS","PosLKOH" и т.д.