Избранное трейдера Eugene Bright

по

Интеграция Lua и С++ (2)


Обмен данными между Lua и Сpp осуществляется через Lua-стэк, то есть через специальным образом структурированное (по принципу Last In — First Out) пространство. 


Интеграция Lua и С++ (2)

Иллюстрация процесса добавления переменных в Cтэк (Push) и извлечения переменных из Стэка (Pop).

Иными словами, Lua стэк — это одномерный массив переменных (список, строка) с прямой (от 1 до n) индексацией.



Заполняется стэк командами lua_push (С-side) :

void lua_pushnumber (lua_State *L, lua_Number n);
const char *lua_pushstring (lua_State *L,  const char *s);

и другими. 


Новой переменной в стэке Луа длинной n автоматически присваивается индекс [n+1] или [-1], где n+1 — абсолютный индекс переменной, а -1 — индекс новой переменной относительно конца (!) стэка. 




Доступ, к переменным, соответственно осуществляется функциями lua_to (C-side) :

lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
где L — указатель Lua-стэка, а index — абсолютный или относительный индекс переменной в стэке.

( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Скрипт lua Баланс покупок/продаж

Всем привет. Переделал первоначальную версию скрипта. Исправил некоторые ошибки и немного расширил функционал. Теперь скрипт может сохранять данные в текстовый файл, который потом можно анализировать в другой программе (например exсel). Также, в отличии от первого варианта, скрипт показывает в таблице усредненную цену, по которой прошли сделки. В первом варианте отображалась цена последней сделки. И в скрипте добавлен показ накопленной дельты за все время пока скрипт работает.

TICER = "SBER";
CLASS_CODE = "TQBR";
FilePath = getScriptPath() .. "\\export.txt";--путь к файлу
save = false;--сохранять данные в файл если false нет, true да

f = nil;
stopped = false;
t_id = nil
H = -1;
M = -1;
VSELL = 0;
VBUY  = 0;
CDelta = 0;
CountTrans = 0;
PriceTrans = 0.0; 
t = "";
function OnInit()
    CountTrans = 0;
        if save then f = io.open(FilePath,"w"); end
        CreateTable();
end 

function main() 
        while not stopped do 
          if IsWindowClosed(t_id) then
         stopped = true;
      end       
          sleep(10);
        end
end

function CreateTable()
   t_id = AllocTable(); 
   AddColumn(t_id, 0, "Время", true, QTABLE_STRING_TYPE, 10);
   AddColumn(t_id, 1, "BUY", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 2, "SELL", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 3, "Дельта V", true, QTABLE_INT_TYPE, 10);   
   AddColumn(t_id, 4, "AVG Цена", true, QTABLE_DOUBLE_TYPE, 15);
   AddColumn(t_id, 5, "Накопленная Дельта", true, QTABLE_INT_TYPE, 15);
   AddColumn(t_id, 6, "Кол-во сделок", true, QTABLE_DOUBLE_TYPE, 12);   
   tab = CreateWindow(t_id);
   local NAME = tostring(getParamEx(CLASS_CODE,TICER,"LONGNAME").param_image);
   SetWindowCaption(t_id, TICER.." ("..NAME..") Баланс покупок/продаж");
   SetTableNotificationCallback(t_id, EventCallBack);
end

function Calc(alltrade)
        if bit.test(alltrade.flags, 0) then VSELL = VSELL+alltrade.qty;  --Продажа
        else VBUY  = VBUY+alltrade.qty;  end                            
        CountTrans = CountTrans+1;
        PriceTrans = PriceTrans+alltrade.price;                 
end

function OnAllTrade(alltrade)    
        if alltrade.sec_code == TICER then      
                local Rows, Col = GetTableSize(t_id);
                
                if H==-1 or H~= alltrade.datetime.hour then 
                        H = alltrade.datetime.hour;
                        M = alltrade.datetime.min;
                        t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);
                end
                if M==alltrade.datetime.min then
                        Calc(alltrade);
                else                                    
                M=alltrade.datetime.min;        
                        InsertRow(t_id, -1);                                               
                        local Delta = VBUY-VSELL;
                        Price = PriceTrans/CountTrans;
                        SetCell(t_id, Rows, 6, tostring(CountTrans));                   
                        SetCell(t_id, Rows, 0, t);
                        SetCell(t_id, Rows, 1, tostring(VBUY));
                        SetCell(t_id, Rows, 2, tostring(VSELL));                           
                        SetCell(t_id, Rows, 3, tostring(Delta));
                        local SEC_SCALE = tostring(getParamEx(CLASS_CODE,TICER,"SEC_SCALE").param_value);
                        SEC_SCALE = string.format("%.0f",SEC_SCALE);                    
                        SetCell(t_id, Rows, 4, string.format("%."..SEC_SCALE.."f", tostring(Price)));
                   if Rows>=2 then
                           local OldPrice = tonumber(GetCell(t_id,Rows-1,4).image);
                           if OldPrice>Price then 
                                        Red(Rows,4); 
                           else 
                                        Green(Rows,4);
                           end
                           CDelta = tonumber(GetCell(t_id,Rows-1,5).image);
                           CDelta = CDelta + Delta;                        
                        else 
                          CDelta = Delta;
                        end
                        SetCell(t_id, Rows, 5, tostring(CDelta));
                    if Delta<0 then Red(Rows,3); end
                    if Delta>0 then Green(Rows,3); end
                    if CDelta<0 then Red(Rows,5); end
                    if CDelta>0 then Green(Rows,5); end                                                   
                   if save then
                                local Str = tostring(H)..";"..tostring(M)..";"..tostring(VBUY)..";"..tostring(VSELL)..";"
                                                ..tostring(Delta)..";"..tostring(Price)..";"..tostring(CDelta);
                           Str=Str.."\n";
                           SaveFile(Str);
                        end
                t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);                        
                    VBUY = 0;VSELL = 0;
                        PriceTrans = 0;
                        CountTrans = 0;
                        Calc(alltrade);
                end
        end --if alltrade.sec_code == TICER then        
end

function SaveFile(Str)
        if f ~= nil then 
                f:write(Str);           
                f:flush();                               
        end
end

function Red(row,col)
        SetColor(t_id, row, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0));
end
function Yellow(row,col)
        SetColor(t_id, row, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0));
end
function Green(row,col)
        SetColor(t_id, row, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
end


function EventCallBack(t_id, msg, par1, par2)
   if msg==QTABLE_CLOSE then
     OnStop();
   end;
end

function OnStop(s)
  if f ~= nil then f:close(); end
  if t_id ~= nil then
    DestroyTable (t_id);
  end;
  stopped = true;
end




Материал по опционам. Раздаю. Качайте. ВСЕ БЕСПЛАТНО!!!

На это раз для вас опционы.
В материале около 40 видео файлов.
В видео файлах есть субтитры с переводом. Так же к каждому видео файлу написанный перевод в ворде и пдф формате. Так что даже если без субтитров все будет понятно о чем там речь.
ВСЕ БЕСПЛАТНО!!! ОТ ВАС ТОЛЬКО СПАСИБО)))
КАЧАЙТЕ СМОТРИТЕ, ИЗУЧАЙТЕ!!!

НУ У ОДНОГО ГУРУ ВЫ СТОЛЬКО МАТЕРИАЛЕ НЕ НАЙДЕТЕ И СТОЛЬКО ВАМ НЕ ДАСТ И НЕ РАССКАЖЕТ!!!
Раздачу разбил на две части. 0-6 модуль, 7-11 модуль.
Материал по опционам. Раздаю. Качайте. ВСЕ БЕСПЛАТНО!!!
Внутри модуля.
Материал по опционам. Раздаю. Качайте. ВСЕ БЕСПЛАТНО!!!

( Читать дальше )

Какие облигации купить.


Моя долгосрочная стратегия инвестирования подразумевает наличие в портфеле определенного процента облигаций. Причем это должны быть относительно надёжные облигации, к которым относятся ОФЗ и субфедеральные облигации с невысоким уровнем долговой нагрузки субъукта РФ.

В предыдущую мою подборку были включены облигации Мордовия03. На этот раз решила от них отказаться ввиду высокой долговой нагрузки  и возможных трудностей при выплате купонов или погашении облигаций.

Какие облигации купить.
Показатели уровня долговой нагрузки субъектов РФ за 2018 г.  можно посмотреть здесь: 
http://vid1.rian.ru/ig/ratings/gosdolg_01_2019.pdf


При выборе облигаций я в первую очередь обращаю внимание на срок погашения, так как мне важно, чтобы этот срок был 1 максимум 2 года.
Затем на доходность, наименование эмитента и цену.


( Читать дальше )

Перевод ЦБ между брокерами

Алгоритм перевода ценных бумаг (далее по тексту — ЦБ) между брокерами:
1. На счет должны быть куплены ЦБ
2. Подать по телефону поручение брокеру на перевод ЦБ с торгового депозитарного счета на основной депозитарный счет (как правило код счета 17 нулей). В некоторых депозитариях есть возможность делать перевод ЦБ с торгового счета, в таком случае этот пункт пропускаем.
3. Скачать реквизиты с официальных сайтов двух депозитариев (откуда и куда перевод)
4. После того как ЦБ будут переведены на основной депозитарный счет, нужно с паспортом поехать в ваш депозитарий (адрес узнавайте на официальном сайте вашего брокера/депозитария), взять с собой реквизиты куда переводить ЦБ, написать заявление на перевод ЦБ. Если в личном кабинете брокера есть возможность переводить ЦБ дистанционно, то ехать никуда не нужно
5. В этот же день поехать в тот депозитарий куда переводите ЦБ, взять с собой реквизиты откуда переводите ЦБ, написать заявление на прием ЦБ. Если в личном кабинете принимающего брокера есть возможность приема ЦБ дистанционно, то ехать никуда не нужно

( Читать дальше )

Упрощенный алгоритм индикатора zigzag

в дальнейшем в него встрою сигналы и наклонные уровни

Упрощенный алгоритм индикатора zigzag

--[[
параметры: 
Procent - процент зигзага 
--]]
Settings={
Name="ZIGZAGPROF",
Procent=1,
    line=                                     
                {  
					{  
                        Name = "cur1",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,0, 0)
                    }				
                }
}

function Init()
  
  y1 = nil
  y2 = nil
  x1 = 1
  x2 = 1
    
  return 1
  
end

function OnCalculate(index)

  de = Settings.Procent

  vl = C(index)
  if index == 1 then 
	y1 = vl
    y2 = vl
  else   
	  if C(index) > y1*(1+de/100) and y1 < y2 then 
	    x2 = x1
	    y2 = y1	
	    x1 = index 
	    y1 = C(index)	        
	  end 	
	  if C(index) > y1 and C(index) > y2 then 
	    x1 = index 
	    y1 = C(index)	  			  
	  end 
	  	  		
	  if C(index) < y1*(1-de/100) and y1 > y2 then 
	    x2 = x1
	    y2 = y1
	    x1 = index 
	    y1 = C(index)	  		
	  end 	
	  if C(index) < y1 and C(index) < y2 then 
	    x1 = index 
	    y1 = C(index)	  			  
	  end 	  	  		
	end 	
  
  if x1 ~= index then 
    curfrom = x1
	curto = index
  else 
    curfrom = x2
	curto = x1
  end 
 
  if curto ~= curfrom and curfrom ~= nil and curto ~= nil then 
    if C(curto) ~= nil and C(curfrom) ~= nil then 
      k = (C(curto)- C(curfrom))/(curto- curfrom)  
      for i = curfrom, index  do
        curv = i*k + C(curto) - curto*k  		          
	    SetValue(i, 1, curv)
      end   	
	end 
  end 
  
  return vl
 
  
end


 

 
  • обсудить на форуме:
  • Quik Lua

Обновление w32.dll x64 бита для Quik v8 с поддержкой автологина

    • 31 июля 2019, 23:19
    • |
    • П М
  • Еще
Оказывается в моём предыдущем посте Раздаю x64 lua библиотеки для Quik8, w32 исходники которые я взял с открытого репозитария, были не самые последние.
Как мне подсказали здесь, известнейший скрипт автологина не работал, т.к. ему не хватало нужных функций FindWindowEx, SetFocus и тп

Ну что делать, не фотошопить же объёмы, а? Я просто обновил библиотеку, добавив в неё недостающие функции. Затем нашел более полный исходник.
Там добавлены ещё функции проигрывания звуков. Собрал с этим исходником. 

Автологин теперь работает и в Quik v8

w32.dll


Про Баффета и доходности. Ч2. Что делать?

Лошадь  выбирают по зубам
Брокера по свопам


В прошлом блоге было несколько выводов

Печатная машина США работает ровно так, что бы S&P включая дивиденды не перегнал эмиссию.

И
Что бы твоя доля среди держателей  банкнот США оставалась хотя бы неизменной, в золоте нужно зарабатывать 4% в год. Планка  существенно ниже чем 10% в баксах.


То есть 9.9% в год это на самом деле  0 (НОЛЬ)
Вопрос был что делать?

Ответ типа купить яйца Фаберже, вряд ли кого то устроит. Хотя за 100лет они подорожали более чем в 3000раз, то есть в среднем те же 9% в год.

Странное совпадение с эмиссией долларов и доходностью СП500(включая дивиденды).


Если вы имеете бизнес и читаете на СЛ этот пост, значит ваши активы-пассивы=капитал так  же не дают прироста  10% в год.

-Что делать?

-Что делать?

-Спекулировать!

На СЛ уже был пост о том, о чем пойдет речь ниже. (Пост от Гнома 

( Читать дальше )

Дюпон-батюшко

    • 08 июня 2019, 14:44
    • |
    • Sedok
  • Еще
В порядке алаверды вот этому посту: https://smart-lab.ru/blog/543417.php .

Ильич в работе «Последний клапан» (т. 21, с. 386) указывал, что расслоение деревни, с выделением кулачества — это последний клапан, через который пар революции и прорвется в социальную жизнь. Так оно и случилось.

Равным образом, в мировой экономике тоже есть такой последний клапан. Это финансовый рычаг ФР, Debt-to-Equity, отношение заёмного капитала к собственному. Чтобы понять, как он играет и почему он клапан, необходимо заглянуть в статистику по индексу S&P, например, вот сюда: https://www.yardeni.com/pub/spxratios.pdf .

Есть формулы, значение которых недооценено в экономическом анализе. Прежде всего, это разложение Дюпона: ROE = ЧР * ОбП * (1 + ФР), где ЧР чистая рентабельность, ОбП — оборачиваемость пассивов (со снятым НДС в выручке), ФР — финансовый рычаг. Посмотрим, что сейчас в ROE, и что здесь драйверы, what is hot & what is not, как говорят у них.

ROE = 9% годовых. Примерно совпадает с депозитом в банке Тинькофф, слава ему. В 2 раза ниже, чем то же ROE в индустриальном секторе. Ну, где производство выведено в Китай, и ещё есть люфт по зарплатам.

( Читать дальше )

Как определить хорошую точку входа? (часть 1)

От более стратегического видения рынка, который я описывал, например, в статьях:

https://smart-lab.ru/blog/534372.php

https://smart-lab.ru/blog/535384.php

https://smart-lab.ru/blog/536789.php


предлагаю перейти к тактическому и задумаемся, как оценить качество того или иного алгоритма входа в позицию по некоторому инструменту. 

Как определить хорошую точку входа? (часть 1)


Одним из таких подходов является MFE/MAE анализ. Что это такое? Рассмотрим рисунок ниже.

Как определить хорошую точку входа? (часть 1)



( Читать дальше )

....все тэги
UPDONW
Новый дизайн