Торговый автомат Амиброкер+АльфаДирект

  • Автор темы orange2000
  • Дата начала

orange2000

New member
Добрый день всем!
Решил попробовать сделать робота для данной схемы. Сам не крутой программер, поэтому я соединил в одно две вещи: Робота Меха для квика и наработки в этой теме:
http://www.russian-trader.ru/forum/viewtopic.php?t=4127

вот что у меня получилось:


Код:
EnableScript("vbscript");

<% 
Dim AD 
Set AD = CreateObject("ADLite.AlfaDirect") 

function OrderBuy(vbprice) 
vbordernum = AD.CreateLimitOrder ("11111-000", "FORTS", "RTSI-12.09", "24.10.09 23:00", "Buy comment", "RUR", "B", "1", vbprice, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10) 
OrderBuy = vbordernum 
End function 

function OrderSell(vbprice) 
vbordernum = AD.CreateLimitOrder ("1111-000", "FORTS", "RTSI-12.09", "24.10.09 23:00", "Sell comment", "RUR", "S", "1", vbprice, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, 10) 
OrderSell = vbordernum 
End function 

%> 


TickerID=1;         // уникальный для каждого индикатора номер
Ticker="RTSI-12.09";      // название бумаги в Амиброкере. На другой бумаге работать не будет
TimeFrame=1;       // таймфрейм в минутах. На других таймфреймах работать не будет
Classcode="";   // код класса бумаги
Seccode="RTSI-12.09";     // код бумаги

lots=0;             // сколько лотов желаете торговать
Otstup=-2; // в процентах. заявка будет выставлена хуже текущей цены на столько процентов


////////// Правила системы ///////////////
Buy= Cross(C, EMA(C,12));
Sell= Cross(EMA(C,12) , C);
Short=0;Cover=0;
////// Убираем лишние сигналы /////////////
Buy=ExRem(Buy,Sell);Sell=ExRem(Sell,Buy);
///////////// Рисуем всякое ///////////////
Equity( 1 );
GraphXSpace = 9;
Plot(C,"price",12,1);
PlotShapes(IIf(Buy,shapeUpArrow,0),5,0,Graph0,-15);
PlotShapes(IIf(Sell,shapeDownArrow,0),4,0,Graph0,-15);
Plot( Volume, "Volume", 0, styleHistogram | styleOwnScale, 1,110000 ); 

//////////// Формируем транзакцию.//////////////
//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////


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

if ((Now(3)==LastValue(DateNum()))AND(BarCount>1)AND(Name()==Ticker)AND(TimeFrame==Interval()/60)AND((Buy[BarCount-1]==1)OR(Sell[BarCount-1]==1)OR(Short[BarCount-1]==1)OR(Cover[BarCount-1]==1))) {
  ifbuy=IIf(Buy[BarCount-1]==1,1,0);  
  ifsell=IIf(Sell[BarCount-1]==1,1,0);  
  ifshort=IIf(Short[BarCount-1]==1,1,0);  
  ifcover=IIf(Cover[BarCount-1]==1,1,0);    
  if (ifbuy) { 
	price=(1+Otstup/100)*Close[BarCount-1];
	script = GetScriptObject(); 
	OrderNum = script.OrderBuy (price);
	WriteVal (OrderNum);

  }
  if (ifsell) { 
	price=(1-Otstup/100)*Close[BarCount-1];
	script = GetScriptObject(); 
	OrderNum = script.OrderSell (price); 
	WriteVal (OrderNum);

  }
  if (ifshort) { 
    price=(1-Otstup/100)*Close[BarCount-1];
    OrderNum = script.OrderSell (lots, price); 
	WriteVal (OrderNum);

  }
  if (ifcover) { 
    price=(1+Otstup/100)*Close[BarCount-1];
    OrderNum = script.OrderBuy (lots, price); 
	WriteVal (OrderNum);

  }
}
для простоты системка на средних. Только лонг, 1 лот, фьюч РТС, минутка. Отступ "-2" сделан что бы сделки не совершались а просто вешались в стакан подальше.

Данный код работает не совсем корректно. При поступлении сигнала (напр. лонг) в АД отправляется сделка 1 лот. Но при каждом обновлении графика в ами сигнал генерируется по новой, т.е. за минуту отсылается 2 раза сделка. (в ами больше 30 секунд обновление графика не делается). Это проблема.
При 5 минутном фрейме, таких сделок будет уже 10...Поэтому это нужно как-то исправить...

В общем может кто поможет поправить код. Ну и в целом доработать его.
Думаю это может пригодиться многим.
 

ahg

New member
Данный код работает не совсем корректно. При поступлении сигнала (напр. лонг) в АД отправляется сделка 1 лот. Но при каждом обновлении графика в ами сигнал генерируется по новой, т.е. за минуту отсылается 2 раза сделка. (в ами больше 30 секунд обновление графика не делается). Это проблема.
В коде у меха это решено тем, что каждая выставляемая заявка имеет свой ID, формируемый по номеру тикера, направлению сделки, дате-времени бара.
А при записи в файл экспорта сначала идет проверка: выставлялась такая заявка или нет.

Код:
procedure savetrifile(stransid,sstr) {
  f=fopen(FileName,"r");
  found=0;
  if (f) {
    while (!feof(f)) {
      s=fgets(f);
      if (StrFind(s,stransid)>0) {
        found=1;
      }
    }
    fclose(f);
  }
  if (found==0) {
    f=fopen(FileName,"a");
    if (f) {
      fputs(sstr+"\n",f);
      fclose(f);
    }
  }
}
 
Your email address will not be publicly visible. We will only use it to contact you to confirm your post.
Сверху