Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Робот для Квика через API Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
FedorovMG



Зарегистрирован: 14.08.2014
Сообщения: 58

СообщениеДобавлено: Чт Май 14, 2015 7:42 am Ответить с цитатой Вернуться к началу

Если я хочу добавить TakeProfit - правильно ли я переделал?
Код:

/// стопы ///
if(pos > 0 AND H[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + take/100))
{
   Sell1 = 1;
   str = str + "  сработал тейк при лонге";
}
else if(pos < 0 AND L[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - take/100))
{
   Cover1 = 1;
   str = str + "  сработал тейк при шорте";
}

И будет ли эта конструкция работать одновременно со стопом?
Посмотреть профиль Отправить личное сообщение
FedorovMG



Зарегистрирован: 14.08.2014
Сообщения: 58

СообщениеДобавлено: Чт Май 14, 2015 9:18 am Ответить с цитатой Вернуться к началу

Вот полность код:
Код:

Filter = 1;
SetBarsRequired(sbrAll, sbrAll);

TimeFrame      = 60;                     // таймфрейм в секундах.
Account         = "NL0011100043";         // Номер счета
Client_Code   = "38000";                  // Код Клиента
Quik            = "C:\\QUIK";            // путь к Квику


Tickers = "SPFB.RTS";             // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////

///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////

if(Name() == "SPFB.RTS") {            //Символ как он называется в Ами
   SecCode      = "RIM5";            
   Class         = "SPBFUT";
   Lots         = 1;
   TickS         = 10;               // Минимальный шаг цены торгуемой бумаги
   Take         = 1.5;               // профит в %
   Stop         = 1;               // стоп в %
   Otstup         = 10;               // Заявка будет выставлена хуже текущей цены на Otstup рублей
}
//else if(Name() == "SBER") {         //Символ как он называется в Ами
//   SecCode      = "SBER03";            
//   Class         = "EQBR";
//   Lots         = 2;
//   TickS         = 0.01;            // Минимальный шаг цены торгуемой бумаги
//   Stop         = 2;               // стоп в %
//   Otstup         = 1;               // Заявка будет выставлена хуже текущей цены на Otstup рублей
//}

////////////////////////////////////

text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + "  " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");

//////////////Система///////////////

Buy1 = Cross(C, MA(C, 40)) AND C > MA(C, 20);
Sell1 = Cross(MA(C, 20), C);
Short1 = Cross(MA(C, 40), C) AND C < MA(C, 20);
Cover1 = Cross(C, MA(C, 20));

///////////Конец Системы////////////

Buy1 = Buy1[BarCount - 2] AND L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100);
Sell1 = Sell1[BarCount - 2];
Short1 = Short1[BarCount - 2] AND H[BarCount - 1] < C[BarCount - 2]*(1 + Stop/100);
Cover1 = Cover1[BarCount - 2];


/// Take ///
if(pos > 0 AND H[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + Take/100))
{
   Sell1 = 1;
   str = str + "  сработал тейк при лонге";
}
else if(pos < 0 AND L[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - Take/100))
{
   Cover1 = 1;
   str = str + "  сработал тейк при шорте";
}


/// Stop ///
if(pos > 0 AND L[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - Stop/100))
{
   Sell1 = 1;
   str = str + "  сработал стоп при лонге";
}
else if(pos < 0 AND H[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + Stop/100))
{
   Cover1 = 1;
   str = str + "  сработал стоп при шорте";
}

///////////// проверка наличия символа в списке для торговли ////////////////

k = 0;
Permit_Ticker = False;
do {
  Tick = StrExtract(Tickers, k);
  k++;
  if(Name() == Tick)
    Permit_Ticker = True;
} while(Tick != "");

///////////    Функции  ////////////

procedure orders(bs, pr, Lot)
{
   connection = 0;

   QC = AS_QUIK_CONNECT(Quik);

   if (QC == 1)
   {
      connection = 1;
      text = "Есть соединение с сервером";
      Color = colorGreen;
   }
   else if (QC == -1)
   {
      text = "нет соединения с квиком";
      Color = colorRed;   
   }
   else if (QC == -2)
   {
      text = "нет соединения с сервером";
      Color = colorRed;
   }
   else
   {
      text = "фигня какая то";
      Color = colorRed;
   }
 
   if(connection == 1)
   {
      order = AS_QUIK_SEND_SYNC_NEWORDER(   "123",            // OrderID - Любые цифры
                                                Account,
                                                Client_Code,
                                                "L",                  // Тип заявки M-рыночная, L-лимитированная
                                                Class,
                                                SecCode,
                                                bs,
                                                pr,
                                                Lot);
   }

   if(StrToNum(order) > 100)
   {
      iz = "исполнена";
      coloriz = colorGreen;
      str = str + "  заяка исполнена" + " ответ сервера=" + order;
      if(pos > 0 AND bs == "S")                // закрытие лонга
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
      }
      else if(pos == 0 AND bs == "S")         // шорт
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
      }
      else if(pos < 0 AND bs == "B")          // закрытие шорта
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
      }
      else if(pos == 0 AND bs == "B")       // лонг
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", Close[BarCount - 2]);
      }
      str = str + "  позиция на момент исполнения " + pos;
   }
   else {
      iz = "не исполнена";
      coloriz = colorRed;
      str = str + "  заяка НЕ исполнена" + " ответ сервера=" + order;
   }
}

////////// конец Функций //////////

if (TimeFrame == Interval() AND Permit_Ticker)
{
   if(Buy1[BarCount-1] AND pos == 0) {
      str = str + "  Buy";
      sd = "Buy";
      orders("B", round(C[BarCount-1]) + Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   if(Sell1[BarCount-1] AND pos > 0) {
      str = str + "  Sell";
      sd = "Sell";
      orders("S", round(C[BarCount-1]) - Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
   if(Short1[BarCount-1] AND pos == 0) {
      str = str + "  Short";
      sd = "Short";
      orders("S", round(C[BarCount-1]) - Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   if(Cover1[BarCount-1] AND pos < 0) {
      str = str + "  Cover";
      sd = "Cover";
      orders("B", round(C[BarCount-1]) + Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
}
else if(TimeFrame != Interval()) {
   PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
                     "ошибка", timeout = 5, left = -1, top = -1 );
}

SetOption( "NoDefaultColumns", 1 );
AddTextColumn(Name(), "Символ", 1.0, colorDefault, colorDefault, 60);
AddColumn( C[BarCount-1], "Последняя цена", 1.2, colorDefault, colorDefault, 100 );
AddColumn( AS_READ_PARAM("Quik_Robot", Name(), "pos"), "Позиция", 1.0, colorDefault,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") > 0, colorGreen,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") < 0, colorRed, colorDefault)), 60);
AddTextColumn(sd, "Сигнал", 1.0, colorDefault, colorDefault, 60);
AddTextColumn(text, "Соединение", 1.2, colorDefault, color, 170);
AddTextColumn(iz, "Исполнение заявки", 1.2, colorDefault, coloriz, 120 );
AddTextColumn(order, "Заявка", 1.2, colorDefault, IIf(StrToNum(order) > 100, colorGreen, colorRed), 90);
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Май 14, 2015 9:48 am Ответить с цитатой Вернуться к началу

FedorovMG писал(а):
Если я хочу добавить TakeProfit - правильно ли я переделал?
Код:

/// стопы ///
if(pos > 0 AND H[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + take/100))
{
   Sell1 = 1;
   str = str + "  сработал тейк при лонге";
}
else if(pos < 0 AND L[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - take/100))
{
   Cover1 = 1;
   str = str + "  сработал тейк при шорте";
}

И будет ли эта конструкция работать одновременно со стопом?

Не правильно. При лонге для срабатывании тейка цена должна стать БОЛЬШЕ цены тейка. Тут H[BarCount-1] < AS_READ_PARAM... надо поменять < на > b и аналогично для шорта.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Май 14, 2015 9:52 am Ответить с цитатой Вернуться к началу

И кроме того вот тут

Код:
Buy1 = Buy1[BarCount - 2] AND L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100);
Sell1 = Sell1[BarCount - 2];
Short1 = Short1[BarCount - 2] AND H[BarCount - 1] < C[BarCount - 2]*(1 + Stop/100);
Cover1 = Cover1[BarCount - 2];

надо добавить фильтр на тейк по аналогии с фильтром стопа.

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

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
FedorovMG



Зарегистрирован: 14.08.2014
Сообщения: 58

СообщениеДобавлено: Чт Май 14, 2015 10:02 am Ответить с цитатой Вернуться к началу

Код:

Buy1 = Buy1[BarCount - 2] AND L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100) AND H[BarCount - 1] < C[BarCount - 2]*(1 + Take/100);
Sell1 = Sell1[BarCount - 2];
Short1 = Short1[BarCount - 2] AND H[BarCount - 1] < C[BarCount - 2]*(1 + Stop/100) AND L[BarCount - 1] > C[BarCount - 2]*(1 - Take/100);
Cover1 = Cover1[BarCount - 2];

Так правильно?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Май 14, 2015 10:19 am Ответить с цитатой Вернуться к началу

Buy1 это лонг. Стоп при лонге это если цена МЕНЬШЕ уровня стопа.
Почему ты сделал больше?
L[BarCount - 1] > C[BarCount - 2]*(1 - Stop/100)
то же для профита. Он сработает когда цена БОЛЬШЕ уровня профита.

Короче надо так
Код:
Buy1 = Buy1[BarCount - 2] AND L[BarCount - 1] < C[BarCount - 2]*(1 - Stop/100) AND H[BarCount - 1] > C[BarCount - 2]*(1 + Take/100);
Sell1 = Sell1[BarCount - 2];
Short1 = Short1[BarCount - 2] AND H[BarCount - 1] > C[BarCount - 2]*(1 + Stop/100) AND L[BarCount - 1] < C[BarCount - 2]*(1 - Take/100);
Cover1 = Cover1[BarCount - 2];

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
FedorovMG



Зарегистрирован: 14.08.2014
Сообщения: 58

СообщениеДобавлено: Чт Май 14, 2015 10:38 am Ответить с цитатой Вернуться к началу

Кстати эту часть я не менял, а скопировал как есть. Сейчас еще раз сверил - везде на сайте в Buy1 стоит >. А в Short1 соответственно <.
Посмотреть профиль Отправить личное сообщение
Enhema



Зарегистрирован: 25.12.2014
Сообщения: 36

СообщениеДобавлено: Чт Май 14, 2015 10:45 am Ответить с цитатой Вернуться к началу

Продолжаю тему со StopBar...
захотелось добавить еще чтобы после тейка делал паузу в один бар.
Что то не вышло.
Вот код:
Код:
stop = 0;
VarStop = 0;

stopBar = AS_READ_PARAM("Quik_Robot", Name(), "stopBar");
if( VarStop == 1 )
{
   Buy1 = Buy1 AND BarCount > stopBar + 1 ;
   Short1 = Short1 AND BarCount > stopBar + 1;
}
else
{
Buy1 = Buy1 AND BarCount > stopBar + 15 ;
Short1 = Short1 AND BarCount > stopBar + 15;
}
/// stops ///
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.947/100))
{
   Sell1 = 1;
   str = str + "  takeprofit Long";
   stop = 1;
   VarStop = 1;
}
else if(pos < 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.947/100))
{
   Cover1 = 1;
   str = str + "  takeprofit Short";
   stop = 1;
   VarStop = 1;
}
else if(pos > 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.304/100))
{
   Sell1 = 1;
   str = str + "  SL Long";
   stop = 1;
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.304/100))
{
   Cover1 = 1;
   str = str + "  SL Short";
    stop = 1;    
}
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Май 14, 2015 10:47 am Ответить с цитатой Вернуться к началу

Это говорит о том, что я ошибся и никто ни разу не заметил. Ужос. Обидно, что моя работа похоже никому не нужна. Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Enhema



Зарегистрирован: 25.12.2014
Сообщения: 36

СообщениеДобавлено: Чт Май 14, 2015 10:52 am Ответить с цитатой Вернуться к началу

000 писал(а):
Это говорит о том, что я ошибся и никто ни разу не заметил. Ужос. Обидно, что моя работа похоже никому не нужна. Smile

Нужна-нужна!!!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Май 14, 2015 11:10 am Ответить с цитатой Вернуться к началу

Enhema писал(а):
Продолжаю тему со StopBar...
захотелось добавить еще чтобы после тейка делал паузу в один бар.
Что то не вышло.
Вот код:
Код:
stop = 0;
VarStop = 0;

stopBar = AS_READ_PARAM("Quik_Robot", Name(), "stopBar");
if( VarStop == 1 )
{
   Buy1 = Buy1 AND BarCount > stopBar + 1 ;
   Short1 = Short1 AND BarCount > stopBar + 1;
}
else
{
Buy1 = Buy1 AND BarCount > stopBar + 15 ;
Short1 = Short1 AND BarCount > stopBar + 15;
}
/// stops ///
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.947/100))
{
   Sell1 = 1;
   str = str + "  takeprofit Long";
   stop = 1;
   VarStop = 1;
}
else if(pos < 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.947/100))
{
   Cover1 = 1;
   str = str + "  takeprofit Short";
   stop = 1;
   VarStop = 1;
}
else if(pos > 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.304/100))
{
   Sell1 = 1;
   str = str + "  SL Long";
   stop = 1;
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.304/100))
{
   Cover1 = 1;
   str = str + "  SL Short";
    stop = 1;    
}

AS_READ_PARAM("Quik_Robot", Name(), "stopBar");
Ты читаешь параметр "stopBar", но я не вижу где ты его записываешь.
Дальше.
if( VarStop == 1 )
Ты считаешь, что присвоив в случае стопа переменной VarStop значение 1 при следующем прогоне это значение сохранится. Это не так.VarStop у тебя при каждом прогоне кода будет 0
VarStop = 0;
Тебе следует при стопе записывать номер бара на котором сработал стоп в файл.
Вот тут
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.947/100))
{
Sell1 = 1;
str = str + " takeprofit Long";
stop = 1;
VarStop = 1;
AS_WRITE_PARAM(..... BarCount-1)
}
и в качестве "индикатора" срабатывания стопа использовать этот параметр.
Только имей в виду, что и-за квикафл оди и тот-же бар может иметь разный номер. Чтобы это отключить используй функцию
SetBarsRequired(sbrAll, sbrAll);

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Enhema



Зарегистрирован: 25.12.2014
Сообщения: 36

СообщениеДобавлено: Чт Май 14, 2015 11:23 am Ответить с цитатой Вернуться к началу

Вот весь код без условий входа в позу
StopBar пишу...
То есть я хочу: при тейке пропускаем один бар, при лоссе 15.
Код:
Filter = 1;
SetBarsRequired(sbrAll, sbrAll);


text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + "  " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");

TimeFrame      = 300;               // таймфрейм в секундах.
Account         = "SPBFUT005bu";   // Номер счета
Client_Code   = "";            // Код Клиента
Quik            = "C:\\QUIK";         // путь к Квику

Tickers = "SPFB.RTS,SPFB.Si"; // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////
RTS_Cond11 = ......;
RTS_Cond21 = ......;
Si_Cond11 = .......;
Si_Cond21 = .......;

RTS_Buy = RTS_Cond11;
RTS_Sell = RTS_Cond21;
RTS_Short = RTS_Cond21;
RTS_Cover = RTS_Cond11;

Si_Buy = Si_Cond11;
Si_Sell = Si_Cond21;
Si_Short = Si_Cond21;
Si_Cover = Si_Cond11;

if(Name() == "SPFB.RTS") //Символ как он называется в Ами
{      
   SecCode         = "RIM5";            
   Class         = "SPBFUT";
   Lots            = 2;
   TickS         = 10;               // Минимальный шаг цены торгуемой бумаги
   Otstup         = 150;                  // Заявка будет выставлена хуже текущей цены на Otstup рублей

Buy1 = RTS_Buy;
Sell1 = RTS_Sell;
Short1 = RTS_Short;
Cover1 = RTS_Cover;

stop = 0;
VarStop = 0;

stopBar = AS_READ_PARAM("Quik_Robot", Name(), "stopBar");
if( VarStop == 1 )
{
   Buy1 = Buy1 AND BarCount > stopBar + 1 ;
   Short1 = Short1 AND BarCount > stopBar + 1;
}
else
{
Buy1 = Buy1 AND BarCount > stopBar + 15 ;
Short1 = Short1 AND BarCount > stopBar + 15;
}
/// stops ///
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.947/100))
{
   Sell1 = 1;
   str = str + "  takeprofit Long";
   stop = 1;
   VarStop = 1;
}
else if(pos < 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.947/100))
{
   Cover1 = 1;
   str = str + "  takeprofit Short";
   stop = 1;
   VarStop = 1;
}
else if(pos > 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.304/100))
{
   Sell1 = 1;
   str = str + "  SL Long";
   stop = 1;
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.304/100))
{
   Cover1 = 1;
   str = str + "  SL Short";
    stop = 1;    
}
}

else if(Name() == "SPFB.Si")       //Символ как он называется в Ами
{
   SecCode         = "SiM5";            
   Class         = "SPBFUT";
   Lots            = 4;
   TickS         = 1;               // Минимальный шаг цены торгуемой бумаги
   Otstup         = 150;                  // Заявка будет выставлена хуже текущей цены на Otstup рублей

Buy1 = Si_Buy;
Sell1 = Si_Sell;
Short1 = Si_Short;
Cover1 = Si_Cover;

stop = 0;
VarStop = 0;

stopBar = AS_READ_PARAM("Quik_Robot", Name(), "stopBar");
if( VarStop == 1 )
{
   Buy1 = Buy1 AND BarCount > stopBar + 1 ;
   Short1 = Short1 AND BarCount > stopBar + 1;
}
else
{
Buy1 = Buy1 AND BarCount > stopBar + 15 ;
Short1 = Short1 AND BarCount > stopBar + 15;
}
/// stops ///
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.936/100))
{
   Sell1 = 1;
   str = str + "  takeprofit Long";
   stop = 1;
   VarStop = 1;
}
else if(pos < 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.936/100))
{
   Cover1 = 1;
   str = str + "  takeprofit Short";
   stop = 1;
   VarStop = 1;
}
else if(pos > 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.305/100))
{
   Sell1 = 1;
   str = str + "  SL Long";
   stop = 1;
}
else if(pos < 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.305/100))
{
   Cover1 = 1;
   str = str + "  SL Short";
    stop = 1;    
}
}
////////////////////////////////////

///////////// проверка наличия символа в списке для торговли ////////////////

k = 0;
Permit_Ticker = False;
do {
  Tick = StrExtract(Tickers, k);
  k++;
  if(Name() == Tick)
    Permit_Ticker = True;
} while(Tick != "");

///////////    Функции  ////////////

procedure orders(bs, pr, Lot)
{
   connection = 0;

   QC = AS_QUIK_CONNECT(Quik);

   if (QC == 1)
   {
      connection = 1;
      text = "Есть соединение с сервером";
      Color = colorGreen;
   }
   else if (QC == -1)
   {
      text = "нет соединения с квиком";
      Color = colorRed;   
   }
   else if (QC == -2)
   {
      text = "нет соединения с сервером";
      Color = colorRed;
   }
   else
   {
      text = "фигня какая то";
      Color = colorRed;
   }
 
   if(connection == 1)
   {
      order = AS_QUIK_SEND_SYNC_NEWORDER(   "123",            // OrderID - Любые цифры
                                                Account,
                                                Client_Code,
                                                "L",                  // Тип заявки M-рыночная, L-лимитированная
                                                Class,
                                                SecCode,
                                                bs,
                                                pr,
                                                Lot);
   }

   if(StrToNum(order) > 100)
   {
      iz = "исполнена";
      coloriz = colorGreen;
      str = str + "  заяка исполнена" + " ответ сервера=" + order;
      if(pos > 0 AND bs == "S")                // закрытие лонга
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
         if(stop == 1)
            AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", BarCount);
      }
      else if(pos == 0 AND bs == "S")         // шорт
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", C[BarCount-1]);
         AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", 0);
      }
      else if(pos < 0 AND bs == "B")          // закрытие шорта
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", 0);
         if(stop == 1)
            AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", BarCount);
      }
      else if(pos == 0 AND bs == "B")       // лонг
      {
         AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
         AS_WRITE_PARAM("Quik_Robot", Name(), "price", C[BarCount-1]);
         AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", 0);
      }
      str = str + "  позиция на момент исполнения " + pos;
   }
   else {
      iz = "не исполнена";
      coloriz = colorRed;
      str = str + "  заяка НЕ исполнена" + " ответ сервера=" + order;
   }
}

////////// конец Функций //////////

if (TimeFrame == Interval() AND Permit_Ticker)
{
   if(Buy1[BarCount-1] AND pos == 0) {
      str = str + "  Buy";
      sd = "Buy";
      orders("B", round(C[BarCount-1]) + Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   if(Sell1[BarCount-1] AND pos > 0) {
      str = str + "  Sell";
      sd = "Sell";
      orders("S", round(C[BarCount-1]) - Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
   if(Short1[BarCount-1] AND pos == 0) {
      str = str + "  Short";
      sd = "Short";
      orders("S", round(C[BarCount-1]) - Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   if(Cover1[BarCount-1] AND pos < 0) {
      str = str + "  Cover";
      sd = "Cover";
      orders("B", round(C[BarCount-1]) + Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
}
else if(TimeFrame != Interval()) {
   PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
                     "ошибка", timeout = 5, left = -1, top = -1 );
}

SetOption( "NoDefaultColumns", 1 );
AddTextColumn(Name(), "Символ", 1.0, colorDefault, colorDefault, 60);
AddColumn( C[BarCount-1], "Последняя цена", 1.2, colorDefault, colorDefault, 100 );
AddColumn( AS_READ_PARAM("Quik_Robot", Name(), "pos"), "Позиция", 1.0, colorDefault,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") > 0, colorGreen,
   IIf(AS_READ_PARAM("Quik_Robot", Name(), "pos") < 0, colorRed, colorDefault)), 60);
AddTextColumn(sd, "Сигнал", 1.0, colorDefault, colorDefault, 60);
AddTextColumn(text, "Соединение", 1.2, colorDefault, color, 170);
AddTextColumn(iz, "Исполнение заявки", 1.2, colorDefault, coloriz, 120 );
AddTextColumn(order, "Заявка", 1.2, colorDefault, IIf(StrToNum(order) > 100, colorGreen, colorRed), 90);
[/code]
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Май 14, 2015 11:47 am Ответить с цитатой Вернуться к началу

Код:
/// stops ///
if(pos > 0 AND C[BarCount-1] > AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 + 0.947/100))
{
   Sell1 = 1;
   str = str + "  takeprofit Long";
//   stop = 1;
//   VarStop = 1;
   AS_WRITE_PARAM("Quik_Robot", Name(), "profitBar", BarCount);
}


Код:
else if(pos > 0 AND C[BarCount-1] < AS_READ_PARAM("Quik_Robot", Name(), "price")*(1 - 0.305/100))
{
   Sell1 = 1;
   str = str + "  SL Long";
//   stop = 1;
   AS_WRITE_PARAM("Quik_Robot", Name(), "stopBar", BarCount);
}



Код:
Buy1 = Buy1 AND BarCount > stopBar + 15 AND  BarCount > profitBar + 1;
Short1 = Short1 AND BarCount > stopBar + 15 AND  BarCount > profitBar + 1;

Перед этим разумеется читаем stopBar и profitBar
Код:
stopBar = AS_READ_PARAM("Quik_Robot", Name(), "stopBar");
profitBar = AS_READ_PARAM("Quik_Robot", Name(), "profitBar");


Забыл один нюанс.
К сожалению я не знаю как работает дата плагин Квика. По идее плагин должен удалять лишние бары когда число баров в базе достигнет парамтре Number of bars: В таком случае последний бар всегда будет иметь BarCount равный Number of bars: - 1. добавляется новый бар и одновременно удаляется самый старый. В таком случае эта конструкция работать не будет. Имей ввиду.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Enhema



Зарегистрирован: 25.12.2014
Сообщения: 36

СообщениеДобавлено: Пт Май 15, 2015 9:23 am Ответить с цитатой Вернуться к началу

Здорово, спасибо!
Олег, вы добавили переменную ProfitBar только в коде. Я так понял, что я могу сам добавлять нужные мне переменные и писать их в файл с помощью AS_WRITE_PARAM ?
Про NumberOfBars учту.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Май 15, 2015 9:26 am Ответить с цитатой Вернуться к началу

Enhema писал(а):

Олег, вы добавили переменную ProfitBar только в коде. Я так понял, что я могу сам добавлять нужные мне переменные и писать их в файл с помощью AS_WRITE_PARAM ?

Привет. Разумеется.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen