Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
27.03.2025, 20:31:36
Начало Помощь Поиск Войти Регистрация
Новости: ООО «Скрин маркет системз», правообладатель программы «Система брокерского обслуживания «TRANSAQ» официально заявляет, что не ведет никакой деятельности в мессенджерах или социальных сетях. 
Подробности на нашем сайте  WWW.TRANSAQ.RU.

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Робот - хранение статических переменных « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Робот - хранение статических переменных  (Прочитано 4691 раз)
Dmitriy
Newbie
*
Сообщений: 13


Просмотр профиля Email
« : 18.02.2014, 18:39:59 »

Доброго вечера, Коллеги!

Не могу сообразить, как правильно хранить статическую переменную (флаг inmarket). Вот код:


static inmarket;
 
function init() {
   setInitCandles(m);
}
Записали входящее значение:

function onHistoryCalculated() {
inmarket = 0;
}

***Ф-ция calc - ее условие проверяем только когда не в рынке (inmarket=0):

function calc()
{
   if (inmarket == 0) {
                                                if (trend == 1 && line[0] < line[1])
                                              {
                                                 while (inmarket < 1)
                                                         {  trade_action::sell(lot, ::lots);       
                                                             inmarket += 1;
                                                             signal::alert("inmarket=1, sell !!!"); } 
                                               }
                                  if (trend == -1 && line[0] > line[1])
                                             {
                                                while (inmarket < 1) 
                                                           {  trade_action::buy(lot, ::lots);             
                                                              inmarket += 1; 
                                                              signal::alert("inmarket = 1, buy!!!");    } 
                                             }
                                          }           
}

***Ордер выставлен, inmarket=1, теперь выставляем к нему стопы. НО:  онТрейд ведь может вызваться и при срабатывании стопов. Поэтому проверяем inmarket: если 1 - ставим стоп и меняем флаг на 2, а если флаг уже 2 - то обнуляем его чтоб ждать нового входа:

function onTrade(var id)
{
   if (inmarket == 1)  {
                                 var trade = getTrade(id);
                                 var stop = new_object("hash");

                                if (trade["operation"] == OP_BUY) {         
                                                                    while (inmarket < 2) {
                                                                    inmarket += 1;
                                                                    signal::alert("ê inmarket =1+1,=2 (buy)");
                                                                    stop["operation"] = OP_SELL;
                                                                    stop["sl_quantity"] = lot;
                                                                    stop["sl_activationprice"] = trade["price"] - 5;
                                                                    stopid = trade_action::transact(stop);
                                                                   }
                                                               }
                               else if (trade["operation"] == OP_SELL) {         
                                                                 while (inmarket < 2) {
                                                                 inmarket += 1;
                                                                 signal::alert(" inmarket = 1+1=2 (sell)");
                                                                 stop["operation"] = OP_BUY;
                                                                 stop["sl_quantity"] = lot;
                                                                 stop["sl_activationprice"] = trade["price"] + 5;
                                                                 stopid = trade_action::transact(stop);
                                                                }
                                                          }
                         else if (inmarket == 2) {
                                                                 while (inmarket > 0) {
                                                                 inmarket -= 2;       
                                                                 signal::alert("inmarket = 0");
                                                                  }                                                             
                                                              }
                                  }
}

Теперь главное: все алерты выходят как надо: сначала 1, потом 2, потом 0 (и больше никаких). Тем не менее, после срабатывания стопов inmarket принимает предпоследнее значение: 1.

Будьте добры, подскажите: есть подозрение, что я неверно его храню с помощью onHistoryCalculated... Хотя иногда он все-таки обнуляется =)
Заранее благодарю!!!
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #1 : 19.02.2014, 10:42:25 »

Честно говоря не смог разобраться что требуется и что идёт не так.
Записан
Dmitriy
Newbie
*
Сообщений: 13


Просмотр профиля Email
« Ответ #2 : 19.02.2014, 10:49:55 »

Вечером на медленном рынке заметил: сначала все как надо, переменная inmarket после входа в рынок принимает значение 1, после выставления стопов - 2, после срабатывания стопа - 0,  а вот потом почему-то становится равным 1. Почему 1??? Не может ведь первое условие выполниться частично? Вопрос следующий: откуда берется единица?
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #3 : 20.02.2014, 09:18:48 »

Сложно так сказать. Попробуйте отлогировать все изменения переменной inmarket, чтобы понимать где именно это происходит.

Вообще может быть такая ситуация, что по одной заявке пройдёт сразу несколько сделок, если заявка не может быть удовлетворена сразу или же не может быть удовлетворена по одной цене. Может быть это как раз тот вариант.
Записан
Dmitriy
Newbie
*
Сообщений: 13


Просмотр профиля Email
« Ответ #4 : 20.02.2014, 10:48:39 »

Я пробовал это сделать, и выяснил что переменная в итоге принимает предпоследнее значение. Тут что-то связано с onHistoryCalculated, как мне кажется, или я не прав?
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #5 : 20.02.2014, 11:15:04 »

Не очень понял что значит "предпоследнее" значение. Переменные типа static не могут быть изменены кроме как какой-то операцией, onHistoryCalculated тут явно не при чем.
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #6 : 20.02.2014, 14:16:05 »

Суть такая : когда вы провели весь цикл своих операций, inmarket   эта переменная и так становится = 0,  function onTrade(var id) - заканчивает свою работу и больше не вызывается, но как вы объясните функции calc() - что ей бы тоже не мешало остановиться - чтобы не накручивать inmarket .

Вы скажете что она там не накручивается !!!!

Ан нет: если inmarket стал = 0, то  хоть одно условие выполнится:
№1:  if (trend == 1 && line[0] < line[1])
№2 : if (trend == -1 && line[0] > line[1])
№3:  while (inmarket < 1)        -  а это уже выполняется,...

вот тут :
function calc()
{
   if (inmarket == 0) {
                                                if (trend == 1 && line[0] < line[1])
                                              {
                                                 while (inmarket < 1)
                                                         {  trade_action::sell(lot, ::lots);       
                                                             inmarket += 1;
                                                             signal::alert("inmarket=1, sell !!!"); } 
                                               }
                                  if (trend == -1 && line[0] > line[1])
                                             {
                                                while (inmarket < 1) 
                                                           {  trade_action::buy(lot, ::lots);             
                                                              inmarket += 1; 
                                                              signal::alert("inmarket = 1, buy!!!");    } 
                                             }
                                          }           
}

так как у вас стоят  trade_action::buy(lot, ::lots);  и trade_action::sell(lot, ::lots);  ,    signal::alert("inmarket = 1, buy!!!");  - не кратные версии - то сюда хоть сколько калков запускай - ни сделки ни алерта - больше чем положенных "Одна штука на свечку" - не произойдет. т.е. не будет продаж, и покупок, а соответственно и не вызовется больше  function onTrade(var id),....

А вот ваш inmarket - заплюсует  += 1;  Вот и все !!!
Записан
Dmitriy
Newbie
*
Сообщений: 13


Просмотр профиля Email
« Ответ #7 : 20.02.2014, 17:19:47 »

Огромное спасибо!! Сразу видно знатока. Действительно, напрасно я с этими кратными функциями завязался =)
Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Робот - хранение статических переменных « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!