//+------------------------------------------------------------------+ //| iBroker.mq4 | //| По мотивам Самообучающийся ЭКСПЕРТ(lsv)| //| Смирнов Ф.Н. 15.03.15 | //+------------------------------------------------------------------+ #property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "Fedor10_10@mail.ru" #property version "1.00" #property description "iBroker" #property strict #property indicator_separate_window //---- indicator settings #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_level1 0.0 //---- input parameters input uchar Step =1; //шаг перцептрона input float Probab =90.0; //% вероятности выигрыша input float forg =5.0; //% забывания истории input uchar PeriodMA=1; //сглаживание тиков при=1 повторение цены input uchar Stop =1; //StopLoss и TakeProfit char sl[2048,1000]; //в связи с использованием матриц применяем короткие типы uchar StopLev,Spread; ushort tr,w,mn,post[2048],Perc; short mb,ms,Prib[2048]; int i,Pr[12],cena[2048,1000],MAt[250]; float forgt,Prob,rost[2048],spad[2048],sum[2048]; double Maxb[],Maxs[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit(void) { //---- 2 indicator buffers mapping SetIndexBuffer(0,Maxb); SetIndexBuffer(1,Maxs); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexStyle(1,DRAW_HISTOGRAM); //--- indicator buffers mapping StopLev=(uchar)MarketInfo(Symbol(),MODE_STOPLEVEL);//Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах Spread=(uchar)MarketInfo(Symbol(),MODE_SPREAD);//Спред forgt=(float)(1.0-forg/100.0);//приведение к более простому виду Prob=(float)(Probab/100.0);//приведение к более простому виду //--- } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- int limit=rates_total-prev_calculated; for(i=0; i0; tr--) { MAt[tr]=MAt[tr-1];//перезаписываем ячейки со сдвигом от старшего к последнему MA+=MAt[tr];//суммируем цены } MAt[0]=Price; MA+=MAt[0]; MA/=PeriodMA;//получаем тиковую МА //+------------------------------------------------------------------+ //| запись истории изменения цены | //+------------------------------------------------------------------+ if(MathAbs(MA-Pr[0])>=Step/*здесь может быть ваш индикатор*/)//при превышении шага произведем перезапись цепочки { Pr[3]=Pr[2]; Pr[2]=Pr[1]; Pr[1]=Pr[0];//перезаписываем ячейки Pr[0]=MA;//перезаписываем цену первой ячейки } //+------------------------------------------------------------------+ if(MathAbs(MA-Pr[4])>=Step+1/*здесь может быть ваш индикатор*/)//при превышении шага произведем перезапись цепочки { Pr[7]=Pr[6]; Pr[6]=Pr[5]; Pr[5]=Pr[4];//перезаписываем ячейки Pr[4]=MA;//перезаписываем цену первой ячейки } //+------------------------------------------------------------------+ if(MathAbs(MA-Pr[8])>=Step+2/*здесь может быть ваш индикатор*/)//при превышении шага произведем перезапись цепочки { Pr[11]=Pr[10]; Pr[10]=Pr[9]; Pr[9]=Pr[8];//перезаписываем ячейки Pr[8]=0;//перезаписываем цену первой ячейки } //+------------------------------------------------------------------+ //| создание перцептрона(выбор трейдера) | //+------------------------------------------------------------------+ Perc=0; mn=1; for(tr=7; tr>0; tr--) {//сравниваестся изменение движения цены трех скоростей, а так же разница между ними if(Pr[tr-1]>Pr[tr]) Perc=Perc+mn;//(предыдущее меньше цена выросла)получается вид ХХХХХХХХХ 9 знаков mn=mn*2;//запоминаем множитель знакоместа 2048трейдеров(2^MemPc-1) } //+------------------------------------------------------------------+ //| открытие виртуального ордера(открытие ордера трейдером под №Perc)| //+------------------------------------------------------------------+ if(cena[Perc,post[Perc]]!=0) post[Perc]++;//если последняя ячейка занята(открыт ордер)подготовим следующюю ячейку //(разрешение трейдеру открыть еще ордер при открытом предыдущем) cena[Perc,post[Perc]]=Price;//запомним цену (открываем виртуальный Ордер)(Трейдер открывает ордер) //+------------------------------------------------------------------+ //| закрытие виртуального Ордера | //+------------------------------------------------------------------+ for(tr=0; tr0)//если Ордер открыт { //+------------------------------------------------------------------+ //| проверка виртуального Ордера | //+------------------------------------------------------------------+ if((Price-cena[tr,w])>Stop && sl[tr,w]==0) sl[tr,w]++; //если цена выросла до стопа и не была в минусе запишем в флаг плюс if((Price-cena[tr,w])>(Stop+Spread))//если цена выросла до цели { if(sl[tr,w]<0) {rost[tr]--; Prib[tr]--;}// и была в минусе уменьшаем рост(трейдеру минус балл) else {rost[tr]++; Prib[tr]++;};//увеличиваем рост(трейдеру плюс балл) rost[tr]*=forgt;//забываем рост spad[tr]*=forgt;//забываем спад sum[tr]=rost[tr]+spad[tr];//запомним сумму cena[tr,w]=0;//закрываем виртуальный Ордер(трейдер закрывает ордер) sl[tr,w]=0;//сброс флага } if((cena[tr,w]-Price)>Stop && sl[tr,w]==0) sl[tr,w]--; //если цена упала до стопа и не была в плюсе запишем в флаг минус if((cena[tr,w]-Price)>(Stop+Spread))//если цена упала до цели { if(sl[tr,w]>0) {spad[tr]--; Prib[tr]++;}// и была в плюсе уменьшаем спад(трейдеру минус балл) else {spad[tr]++; Prib[tr]--;}//увеличиваем спад(трейдеру плюс балл) spad[tr]*=forgt;//забываем спад rost[tr]*=forgt;//забываем рост sum[tr]=rost[tr]+spad[tr];//запомним сумму cena[tr,w]=0;//закрываем виртуальный Ордер(трейдер закрывает ордер) sl[tr,w]=0;//сброс флага } //+------------------------------------------------------------------+ //| подсчет баллов положительных сделок всех трейдеров брокера | //+------------------------------------------------------------------+ if(rost[tr]>0 && spad[tr]>0)//при появлении результатов { if(rost[tr]/sum[tr]>Prob&&Prib[tr]>0.0) {mb+=Prib[tr]; Prib[tr]=0;}//суммируем баллы всех трейдеров по BUY if(spad[tr]/sum[tr]>Prob&&Prib[tr]<0.0) {ms+=Prib[tr]; Prib[tr]=0;}//суммируем баллы всех трейдеров по SELL } } //+------------------------------------------------------------------+ //| Дефрагментация вторичных входов(трейдера) | //+------------------------------------------------------------------+ if(post[tr]>0)//если последняя ячейка не первая { if(cena[tr,w]==0)//если Ордер открыт { cena[tr,w]=cena[tr,w+1]; cena[tr,w+1]=0;//переместим цену с большего номера sl[tr,w]=sl[tr,w+1]; sl[tr,w+1]=0;//переместим флаг стопа с большего номера }//если Ордер последней ячейки закрыт - уменьшим количество ячеек if(cena[tr,post[tr]]==0) post[tr]--; } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+