Андрей
Андрей личный блог
19 августа 2020, 12:16

на память стоп

Запускаем, будет окошко. Нажимаем куда надо. Не мучаемся больше с F2 и F6.

TurboStop (автостоп)



Выставил лотность удвоением от 1 до 32. Можно маргингейлить, можно усреднять, можно пирамидить, можно входить частями — это уж как вам надо. Расписал до 32 контрактов — это по ришке, кажется, лям — для почти всех достаточно.

ВНИМАНИЕ!!!
Для запуска нужно зайти в график торгуемого инструмента, и в цене, на вкладке «Дополнительно», проставить идентификатор «MYSTOP_PRICE».

TurboStop (автостоп)


В начале скрипта параметры. Комментарии там добавил, хитростей нет.

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

Ну, не совсем бесплатно. Интереса ради проведем эксперимент: если у кого возникнет жгучее желание оплатить столь скромную работу, пишите в ЛС, дам номер карты. Самому интересно, поделится ли кто-нибудь хоть стольником за, как мне кажется, полезный скрипт. Об этом потом тоже напишу. Собранные деньги на благотворительность не пойдут, а будут пропиты :)

Ставьте стопы и не сливайте! Курсов не веду, телеграфа нет, в ДУ не беру, всё пофигу.

is_run = true
CLIENT_CODE = "СЮДА СВОЁ"
SEC_CODE="RIU0"
CLASS_CODE="SPBFUT"
ACCOUNT_CODE="СЮДА СВОЁ"
Otstup=20 -- отступ для выставления лимитки
StopLoss=150 -- размер стоплосс

function OnInit()
	t_id = AllocTable();
	AddColumn(t_id, 0, "BUY", true, QTABLE_STRING_TYPE, 12);
	AddColumn(t_id, 1, "SELL", true, QTABLE_STRING_TYPE, 12);
    t = CreateWindow(t_id);
	SetWindowCaption(t_id, "Turbo Stop");
	SetWindowPos(t_id, 400, 300, 220, 160);

	InsertRow(t_id,1)
	InsertRow(t_id,2)
	InsertRow(t_id,3)
	InsertRow(t_id,4)
	InsertRow(t_id,5)
	InsertRow(t_id,6)
	
	SetCell(t_id,1,0,'Buy 1')
	SetCell(t_id,1,1,'Sell 1')
	SetCell(t_id,2,0,'Buy 2')
	SetCell(t_id,2,1,'Sell 2')
	SetCell(t_id,3,0,'Buy 4')
	SetCell(t_id,3,1,'Sell 4')
	SetCell(t_id,4,0,'Buy 8')
	SetCell(t_id,4,1,'Sell 8')
	SetCell(t_id,5,0,'Buy 16')
	SetCell(t_id,5,1,'Sell 16')
	SetCell(t_id,6,0,'Buy 32')
	SetCell(t_id,6,1,'Sell 32')
	
	SetTableNotificationCallback(t_id, OnTableEvent)
end

-- Функция обрабатывает события в таблице
function OnTableEvent(t_id, msg, par1, par2)
    -- Если был клик левой кнопкой
	if msg == QTABLE_LBUTTONDBLCLK then
		if par1 == 1 and par2 == 0 then DoFire(true,1) end
		if par1 == 1 and par2 == 1 then DoFire(false,1) end
		if par1 == 2 and par2 == 0 then DoFire(true,2) end
		if par1 == 2 and par2 == 1 then DoFire(false,2) end
		if par1 == 3 and par2 == 0 then DoFire(true,4) end
		if par1 == 3 and par2 == 1 then DoFire(false,4) end
		if par1 == 4 and par2 == 0 then DoFire(true,8) end
		if par1 == 4 and par2 == 1 then DoFire(false,8) end
		if par1 == 5 and par2 == 0 then DoFire(true,16) end
		if par1 == 5 and par2 == 1 then DoFire(false,16) end
		if par1 == 6 and par2 == 0 then DoFire(true,32) end
		if par1 == 6 and par2 == 1 then DoFire(false,32) end
	end
end

function GetLastPrice(TickerName)
	local NL=getNumCandles("MYSTOP_PRICE")
	tL, nL, lL = getCandlesByIndex ("MYSTOP_PRICE", 0, NL-1, 1) -- last свеча
	local aCurrentPrice=tL[0].close -- получили текущую цену (ЦПС)
	return aCurrentPrice
end

function DoFire(BuyFlag, LotSize)
	if BuyFlag then
		Operat="B"
		StopOperat="S"
		Condi=4
		Revers=1
	else
		Operat="S"
		StopOperat="B"
		Condi=5
		Revers=-1
	end
	
	t = {
			["CLASSCODE"]=CLASS_CODE,
			["SECCODE"]=SEC_CODE,
			["ACTION"]="NEW_ORDER", -- новая сделка.
			["ACCOUNT"]=ACCOUNT_CODE,
			["CLIENT_CODE"]=CLIENT_CODE,
			["TYPE"]="L",
			["OPERATION"]=Operat, -- направление сделки, "B" или "S"
			["QUANTITY"]=tostring(LotSize), -- объем, (акции - в лотах, а не штуках).
			["PRICE"]=string.format("%i", GetLastPrice(SEC_CODE)-Otstup*Revers), -- цену лимитки ставим для мгновенного исполнения.
			["TRANS_ID"]=tostring(LotSize)
		}
	res1 = sendTransaction(t) -- ... передаем сделку по рынку.
	message("ZAYAVKA="..res1)
	if res1=="" then
		message("OK. Need STOP")
		t2 = {
                       ['ACTION'] = "NEW_STOP_ORDER", 
                       ['PRICE'] = string.format("%i", GetLastPrice(SEC_CODE)-(Otstup+StopLoss+100)*Revers), 
                       ['EXPIRY_DATE'] = "TODAY",
                       ['STOPPRICE'] = string.format("%i", GetLastPrice(SEC_CODE)-(Otstup+StopLoss)*Revers),
                       ['STOP_ORDER_KIND'] = "SIMPLE_STOP_ORDER",
                       ['TRANS_ID'] = "11",
                       ['CLASSCODE'] = CLASS_CODE,
                       ['SECCODE'] = SEC_CODE,
                       ['ACCOUNT'] = ACCOUNT_CODE,
                       ['CLIENT_CODE'] = CLIENT_CODE,
                       ['TYPE'] = "L",
                       ['OPERATION'] = StopOperat,
                       ['CONDITION'] = Condi, -- Направленность стоп-цены. Возможные значения: «4» - меньше или равно, «5» – больше или равно
                       ['QUANTITY'] = tostring(LotSize)
        }
		res2 = sendTransaction(t2)
		message("STOP="..res2)
	end
end

function main()
	while is_run do
		sleep(100)
	end
end

function OnStop()
	DestroyTable(t_id)
	is_run = false
	return 1000
end
3 Комментария
  • Vadim S
    19 августа 2020, 15:30
    второй аккаунт  Turbo Pascal ?
    • VladMih
      19 августа 2020, 15:55
      Vadim S, мания преследования? Какая вам разница?
      Полезно — используй, не нужно — пройди мимо.
      Есть критика или пожелания — выкладывай.
      Ни то, ни другое, ни третье — иди… Не скажу куда.

      Да, этот коммент с третьего акка Турбопаскаля. )))

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн