В дополнение в посту выше. В первом посту я не обозначил, что в случае, если данные с индикаторов- нил, у меня стоит задержка 30сек.(на возможную дозагрузку). Изменил задержку на 60сек. Результат -данные обновляются и скрипт не вылетает. Думаю, что эта проблема у меня из-за того, что в настройках соединения снята галочка с «При восстановлении использовать только параметры последнего соединения» . Т.е. восстановление соединения происходит к следующему серверу. В 7-ом это происходило быстрее. Думаю причину я нашел. Спасибо.
На случай разрыва связи по разным причинам в скрипте есть флаги flag_Connected и flag_CleanUp
Код
function OnConnected(fl)
flag_Connected = true;
message("OnConnected");
end;
function OnCleanUp()
flag_CleanUp = true;
message("OnCleanUp");
end;
Если ИСТИНА, то запускаю проверку и обновление данных графика и индикаторов . Сегодня на 7-ом и 8-ом квике запускал один и тот же скрипт с искуственным обрывом связи. На 7-ом все нормально.(как и было до этого). На 8-ом не видит, что эти флаги - Истина. Соответственно, не обновляет данные. Как результат, данные с индикаторов нил.
И реакция разная. На 7-ом - Connected На 8-ом - CleanUp CleanUp
никаких dll или сторонних библиотек не используется в скриптах. Скрипты скомпилированы через стандартную команду:
luac -s -o "$(FileName).luac" "$(FileNameExt)"
Что надо сделать для работы?
Visual Studio для этого не использую. Использую LuaForWindows_v5.1.4-46 Могу ли просто заменить скаченные файлы и дирректории в LuaForWindows? Если нет, то что можно сделать?
Не знаю, что такое уровень рынка. А на что влияет цена заявки?
Уровень рынка - цена совершения сделок по данному инструменту в данный момент.
Цитата
Также, хотел бы спросить, не будет ли убытка в случае операции подачи заявки и практически моментального снятия?
Прибыль/Убыток образуется при открытии и последующем закрытии позиции. Если цена заявки на покупку ниже рынка, вы выставили и сразу сняли - сделок нет, соответственно нет прибыли\убытка. Если цена заявки на покупку по рынку или выше, вы открыли позицию на объем встречного предложения. Сразу снять сможете только неудовлетворенный остаток (если он будет). Т.е. Вы в позиции. Говорить о прибыли/убытке можно после того как Вы закроете позицию, а не после попытки снять выставленную заявку.
Цитата
Но дело в том, что QUIK не позволяет подавать заявки на некоторые инструменты.
Я так понимаю речь идет о 2,3,... эшелонах. Возможно, их нет в листинге биржи. Возможно, стратегия основана на спреде между бумагами и одно плече на бирже не торгуется. Но это не важно. Мне кажется легче выяснить заранее, торгуется ли бумага и не использовать данную стратегию. И не придется совершать телодвижения с подачей и снятием заявок.
Можно взять любой другой объектно-ориентированный язык. Создать форму, в которой можно вносить любые начальные значения, в том числе и в виде выпадающего списка. Сохранить и передать все в qlua через файл.txt.
flag="do not";
for i=start_year,cur_year,1 do
TabSize=........;
if flag=="can do" then
работаем
end;
if (flag=="do not" and TabSize~=0) then
flag="can do";
end;
end
Олег, Скорее всего у Вас отсутствует кусок, отвечающий за контроль исполнения стопа. После
Цитата
моментом отправки приказа на сервер
необходимо убедиться, что заявка выставлена и исполнена. И только потом все остальное, что у Вас написано в коде. Этот контроль можно организовать по-разному. (таблица заявок, таблица сделок, соответствующие им функции обратного вызова, флаги ...). Сколько людей столько и будет алгоритмов. Лучше разобраться и написать самому.
Цитата
Поможет ли, если я заменю стоп-ордер на обычную заявку
Поможет, если проскальзывание будет достаточным для исполнения всех контрактов сразу. Если будет остаток, возникнет та же проблема, но в меньшем объеме. Т.е. опять возвращаемся к блоку скрипта, который контролирует исполнения сделки, о котором я писал выше.
В зависимости от конкретной задачи, возможно, удобней будет использовать Subscribe_Level_II_Quotes.
Если человеку нужно найти заявку один раз в день, зачем ему напрягать процесор через коллбэк? Даже, если ему нужна эта информация в течении дня, но по закрытию свечи, все равно лучше сделать без коллбэка.
Если ему все же удобней сделать через OnQuote, то в предложенной выше функции я бы оставил только флаг на срабатывание, а весь расчет перенес бы в main.
line = "Here it is not necessary to remove[it should be removed]this is also not necessary to remove";
s1 = "(%[)";
s2 = "(%])";
point1 = string.find(line,s1);
point2 = string.find(line,s2);
point3 = string.len(line);
finishline = string.sub(line,1,point1 - 1)..string.sub(line,point2 + 1,point3);
p = 14.593333333333; price = tostring(p); pointplace = string.find(price,". "); --нашли поз. точки (если разделитель - точка) if pointplace then price = string.sub(price,1,pointplace + 2); -- для двух знаков end;
В полный код даже не смотрел. Сделай так math.randomseed(os.clock()); parametr1 = math.random(2,5); parametr2 = math.random(2,5); parametr3 = math.random(2,5); ... ..... parametr... = math.random(2,5);
parametr1 - это то, что ты получаешь. Если выведешь остальные результаты, то увидишь, что разброс начинается со второго. И чем дальше, тем сильнее. Я пользуюсь, начиная с третьего.
Интересно, зачем dofile ("C:\\1.lua") вынесли в отдельную функцию. Это связано с локализацией возможной ошибки или совсем другая причина? Я бы оставил в main до бесконечного цикла. pcall(foo)- собственно, какую ошибку пытаетесь поймать? Подключился ли файл ("C:\\1.lua")? К содержанию таблицы не имеет отношение. На сколько я понял Ваш файл - это файл с данными и в нем не происходит никаких операций. Зачем его подключать через dofile? Мне интересен способ обработки ошибки, которая может возникнуть в самом файле, подключенном через dofile или легче это сделать, например, подключившись через require?
tag может быть идентификатором как графика, так и индикатора. В любом месте графика правой кнопкой мыши - редактировать. Далее, в открывшемся окне, левой кнопкой мыши по нужному Вам индикатору или графику(price). Справа-Дополнительно-Идентификатор(снизу).
Если в скобках ложь. "and" вернет ложь. "or" будет сравнивать ложь и stop_order вернет stop_order . Если в скобках истина . "and" вернет min_stop_order . "or" будет сравнивать min_stop_order и stop_order. Вернет min_stop_order (т.к.min_stop_order - истина).
min_stop_order = min_stop_order or stop_order min_stop_order = (min_stop_order.condition_price <= stop_order.condition_price) and min_stop_order or stop_order
Логическая операция первой строки полностью присутствует во второй. Зачем она, первая строка?
В первой строке "or" вернет min_stop_order , если это истина. Во второй сначала вычисляется "and", и только потом "результат and" or stop_order. Т.е. первую строку нельзя сравнивать с куском второй.
min_stop_order = min_stop_order or stop_order min_stop_order = (min_stop_order.condition_price <= stop_order.condition_price) and min_stop_order or stop_order
зациклился мой мозг минут на 15 на первой итерации, а на второй ушел на больничный... Если знак не перепутан (ищем мы минимум), поясните, пожалуйста.
Полезные идиомы Lua с использованием and и or. Знак не перепутан. Ищем мин. из двух чисел.
min_stop_order = min_stop_order or stop_order min_stop_order = (min_stop_order.condition_price <= stop_order.condition_price) and min_stop_order or stop_order
зациклился мой мозг минут на 15 на первой итерации, а на второй ушел на больничный... Если знак не перепутан (ищем мы минимум), поясните, пожалуйста.
Полезные идиомы Lua с использованием and и or. Знак не перепутан. Ищем мин. из двух чисел.
В теле складывал value. BUY как есть, Sell наделял "-" После делил на количество лотов. И получая среднюю безубыточную цену.
Есть вариант, что дело не в кол-бэках, а в получении средней цены. Возможно, Вам нужна не средняя, а средне-взвешенная цена. Из цитаты это не понятно.
Цитата
Такое ощущение что колбеки не приходят.
Цитата
и меня не интересует варианты с сохранением всех сделок, меня интересует лишь получение средней цены путем описанным выше и его стабильная работа.
Чтобы отмести в сторону все ощущения, нужно хотя бы разок сохранить в файл все, что у Вас проходит после фильтра. И тогда будет точно ясно, грешить на кол-бэк или нет.
после чая увидел пару ошибок (i-локальная в цикле) исправляю на
iterations=20; k=0; finish=100; flag=true; while flag do start=k; step=(finish-start)/iterations; for i=start,finish,step do if i==finish then flag=false; end; --делаем расчёт. if profit>0 then k=i-1; --возвращаемся на step назад iterations=100; --(шаг становится более мелким) break; end; end; end
for j=1,1000000 do start=k step=(finish-start)/iterations for i=start,finish,step do --делаем расчёт. if profit>0 then k=i-1 --возвращаемся на step назад iterations=100 --(шаг становится более мелким) break end end if i==finish then break end Не проверял. Но, возможно, как направление мысли.
Теперь понятно. Вы делали sleep() в основном потоке .Я Вас не правильно понял. Сори. А в описании это есть. Использование Луа в Рабочем месте... Взаимодействие потоков и т.д.
Слишком мало информации, что бы что то посоветовать. Если у Вас sleep(1000) в том кусочке , что Вы представили и все виснет, то есть большая вероятность, что ошибка совсем в другом месте. Чему равен sleep в while-цикле в main() или других функциях и есть ли он вообще? Есть ли условия выхода из цикла и насколько они работоспособны. И еще 100 вопросов ни о чем, пока не увидим тело скрипта.
Надеюсь, внутри "операции" есть условие при котором t=false. До или после него поставьте месседжер и сделайте входящие, при которых точно t=false. Возможно, sleep ни при чем. На время отладки сделайте sleep в 1-5 секунд, что бы не перезагружаться, а просто останавливать скрипт. Для большего необходимо больше информации.
Для goto есть ограничения, связанные с видимостью метки. -нельзя выпрыгнуть из функции -нельзя впрыгнуть в блок -нельзя впрыгнуть в область видимости локальной переменной. Возможно, один из вариантов Ваш.
filename = "\\MyData2.txt"; Myfile = io.open(getScriptPath()..filename,"r+"); -- Если файл не существует if Myfile == nil then message("Нету таких"); OnStop(); end;
Андрей написал: А как сейчас мне закрыть эти заявки? Какой общепринятый механизм закрытия заявки, в коде я конечно могу поменять одну строку, что бы заявка закрылась
Не много не понятен термин "закрыть заявку". Можно закрыть позицию или сделку. Т.е. заявка удовлетворена - перешла в сделку(см. таблица сделок). Что б ее закрыть необходимо совершить противоположную сделку. Т.е. подать заявку не только противоположного направления, но и, возможно, изменить цену. Если Вы имеете ввиду снять заявку, которая еще не удовлетворена(см. таблица заявок), необходимо ACTION = "KILL_ORDER" и указать номер заявки ORDER_KEY
Цитата
Андрей написал: Но сперва наверно нужно как-то убедиться, что заявка на покупку - перешла в сделку на исполнение, как это сделать? Что бы в заданный момент времени отправить противоположную заявку.
Я делаю через таблицу заявок. По номеру заявки через getItem(). Далее по флагу (активна/не активна). Кто-то делает через таблицу сделок.
Так никто и не ответил? ПАСХА. Проверил сейчас у себя. Все подгружается кроме тиковых графиков. Но у меня вчера не был открыт график (и заказа через ds не было) с таким интервалом. Возможно, у тебя причина в том же.