0
ЧАСТЬ 2
//+------------------------------------------------------------------+
   
void  GAMBAR(int period)
   
{
     
double ResistanceValue=SNR(period,MODE_HIGH);
     
double SupportValue=SNR(period,MODE_LOW);

      color warna1
, warna2;
     
if(period==60)    {warna1=P60R;   warna2=P60S;}
     
if(period==240)    {warna1=P240R;   warna2=P240S;}
     
if(period==1440)    {warna1=P1440R;   warna2=P1440S;}
     
if(period==10080)    {warna1=P10080R;   warna2=P10080S;}

     
string name;
      name
= StringConcatenate("GIVONLY ",TF(period)," RESISTANCE LINE");
      GARIS
(name, ResistanceValue, warna1);
      name
= StringConcatenate(TF(period)," RESISTANCE");
      TULIS
(name, ResistanceValue, warna1);
   
      name
= StringConcatenate("GIVONLY ",TF(period)," SUPPORT LINE");
      GARIS
(name, SupportValue, warna2);
      name
= StringConcatenate(TF(period)," SUPPORT");
      TULIS
(name, SupportValue, warna2);
   
}
//+------------------------------------------------------------------+
   
double SNR(int period, int mode)
   
{
     
bool FindLow=false, FindHigh=false;
     
double snr, PassedLow=999, PassedHigh=0, HIGHEST, LOWEST;
     
int i=1;
     
while(!FindLow || !FindHigh)
         
{
           
if(HIGH(period,i)>PassedHigh) PassedHigh = HIGH(period,i);
           
if(LOW(period,i)<PassedLow)   PassedLow = LOW(period,i);
           
PassedHigh = MathMax(PassedHigh, HIGH(period,0));
           
PassedLow  = MathMin(PassedLow, LOW(period,0));

           
if(!FindHigh && HIGH(period,i)>=HIGH(period,i-1) && HIGH(period,i)>=HIGH(period,i+1) && HIGH(period,i)>=PassedHigh)
               
{
                  HIGHEST
= HIGH(period,i);
                 
FindHigh=true;
               
}  
           
if(!FindLow && LOW(period,i)<=LOW(period,i-1) && LOW(period,i)<=LOW(period,i+1) && LOW(period,i)<=PassedLow)
               
{
                  LOWEST
= LOW(period,i);
                 
FindLow=true;
               
}  
            i
++;
         
}
     
if(mode==MODE_HIGH)  snr=HIGHEST;
     
if(mode==MODE_LOW)   snr=LOWEST;
     
return(snr);
   
}
//+------------------------------------------------------------------+
   
string TF(int period)
     
{
         
string tf;
         
if(period==60)      tf="H1";
         
if(period==240)     tf="H4";
         
if(period==1440)    tf="D1";
         
if(period==10080)   tf="W1";
         
return(tf);
     
}
//+------------------------------------------------------------------+
   
double HIGH(int period, int shift)
     
{
         
double hi=iHigh(Symbol(), period, shift);
         
return(hi);
     
}  
//+------------------------------------------------------------------+
   
double LOW(int period, int shift)
     
{
         
double lo=iLow(Symbol(), period, shift);
         
return(lo);
     
}  
//+------------------------------------------------------------------+
   
void TULIS(string NamaTeks, double value, color warna)
     
{
         
string ValueTeks = StringConcatenate(NamaTeks," ",DoubleToStr(value,Digits));
         
double Value=value;
         
if(value<Bid)  Value=value+Supply_Demand_Area*Point;
         
ObjectCreate(NamaTeks, OBJ_TEXT, 0, Time[35], Value);
         
ObjectSetText(NamaTeks, StringSubstr(NamaTeks,0,4), 10, "Tahoma", warna);
         
ObjectMove(NamaTeks, 0,  Time[35], Value);
     
}
//+------------------------------------------------------------------+
   
void GARIS(string name, double value, color warna)
     
{
         
ObjectCreate(name, OBJ_HLINE, 0,  Time[0], value);
         
ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
         
ObjectSet(name, OBJPROP_COLOR, warna);
         
ObjectMove(name, 0,  Time[0], value);
     
}

Надо код в индикаторе заменить полностью на этот код из 2 частей по порядку и скомпилировать файл.
Индикатор будет считать значения не на каждом тике, а на каждой новой свече.
avatar

Oxy

  • 11 марта 2015, 17:29
0
Код индикатора. ЧАСТЬ 1
//+------------------------------------------------------------------+
//|                                              Givonly_SnR_SnD.mq4 |
//|                                                          Givonly |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Givonly"
#property link      "http://www.kgforexworld.com & http://oxy.opentraders.ru/bio/"
#property indicator_chart_window

extern bool SHOW_H1=true;
extern bool SHOW_H4=true;
extern bool SHOW_D1=true;
extern bool SHOW_W1=true;
extern int Supply_Demand_Area=10;
extern color SupportColor = DodgerBlue;
extern color ResistanceColor = Red;
extern color P60R=LightGray;
extern color P60S=LightGray;
extern color P240R=LightGray;
extern color P240S=LightGray;
extern color P1440R=LightGray;
extern color P1440S=LightGray;
extern color P10080R=LightGray;
extern color P10080S=LightGray;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 
{
   
return(INIT_SUCCEEDED);
 
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 
{
//----
   
if(ObjectFind("H1 RESISTANCE")==0) ObjectDelete("H1 RESISTANCE");
   
if(ObjectFind("H4 RESISTANCE")==0) ObjectDelete("H4 RESISTANCE");
   
if(ObjectFind("D1 RESISTANCE")==0) ObjectDelete("D1 RESISTANCE");
   
if(ObjectFind("W1 RESISTANCE")==0) ObjectDelete("W1 RESISTANCE");
   
if(ObjectFind("H1 SUPPORT")==0) ObjectDelete("H1 SUPPORT");
   
if(ObjectFind("H4 SUPPORT")==0) ObjectDelete("H4 SUPPORT");
   
if(ObjectFind("D1 SUPPORT")==0) ObjectDelete("D1 SUPPORT");
   
if(ObjectFind("W1 SUPPORT")==0) ObjectDelete("W1 SUPPORT");
   
if(ObjectFind("GIVONLY H1 RESISTANCE LINE")==0) ObjectDelete("GIVONLY H1 RESISTANCE LINE");
   
if(ObjectFind("GIVONLY H4 RESISTANCE LINE")==0) ObjectDelete("GIVONLY H4 RESISTANCE LINE");
   
if(ObjectFind("GIVONLY D1 RESISTANCE LINE")==0) ObjectDelete("GIVONLY D1 RESISTANCE LINE");
   
if(ObjectFind("GIVONLY W1 RESISTANCE LINE")==0) ObjectDelete("GIVONLY W1 RESISTANCE LINE");
   
if(ObjectFind("GIVONLY H1 SUPPORT LINE")==0) ObjectDelete("GIVONLY H1 SUPPORT LINE");
   
if(ObjectFind("GIVONLY H4 SUPPORT LINE")==0) ObjectDelete("GIVONLY H4 SUPPORT LINE");
   
if(ObjectFind("GIVONLY D1 SUPPORT LINE")==0) ObjectDelete("GIVONLY D1 SUPPORT LINE");
   
if(ObjectFind("GIVONLY W1 SUPPORT LINE")==0) ObjectDelete("GIVONLY W1 SUPPORT LINE");
   
if(ObjectFind("H1 SUPPLY AREA")==0) ObjectDelete("H1 SUPPLY AREA");
   
if(ObjectFind("H4 SUPPLY AREA")==0) ObjectDelete("H4 SUPPLY AREA");
   
if(ObjectFind("D1 SUPPLY AREA")==0) ObjectDelete("D1 SUPPLY AREA");
   
if(ObjectFind("W1 SUPPLY AREA")==0) ObjectDelete("W1 SUPPLY AREA");
   
if(ObjectFind("H1 DEMAND AREA")==0) ObjectDelete("H1 DEMAND AREA");
   
if(ObjectFind("H4 DEMAND AREA")==0) ObjectDelete("H4 DEMAND AREA");
   
if(ObjectFind("D1 DEMAND AREA")==0) ObjectDelete("D1 DEMAND AREA");
   
if(ObjectFind("W1 DEMAND AREA")==0) ObjectDelete("W1 DEMAND AREA");
//----
 
}
//+------------------------------------------------------------------+
//| 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[])
 
{
   
if(prev_calculated==0 || (prev_calculated>0 && prev_calculated<rates_total)) {
     
if(SHOW_H1) GAMBAR(60);
     
if(SHOW_H4) GAMBAR(240);
     
if(SHOW_D1) GAMBAR(1440);
     
if(SHOW_W1) GAMBAR(10080);
     
if(Supply_Demand_Area>0) {
       
if(SHOW_H1)    SND(60);
       
if(SHOW_H4)    SND(240);
       
if(SHOW_D1)    SND(1440);
       
if(SHOW_W1)    SND(10080);
     
}
   
}
   
return(rates_total);
 
}
//+------------------------------------------------------------------+
   
void  SND(int period)
     
{
         
string name;
         name
= StringConcatenate(TF(period)," SUPPLY AREA");
         
double atas, bawah;
         atas
= SNR(period,MODE_HIGH);
         bawah
= atas-Supply_Demand_Area*Point;
         
bool ada=false;
         
if(   (SNR(period,MODE_HIGH)==SNR(60,MODE_HIGH) && period>60 && SHOW_H1)
           
|| (SNR(period,MODE_HIGH)==SNR(240,MODE_HIGH) && period>240 && SHOW_H4)
           
|| (SNR(period,MODE_HIGH)==SNR(1440,MODE_HIGH) && period>1440 && SHOW_D1)
           
|| (SNR(period,MODE_HIGH)==SNR(10080,MODE_HIGH) && period>10080 && SHOW_W1)
           
)   ada=true;
         
if(!ada) {
           
ObjectCreate(name,OBJ_RECTANGLE,0,0,0);
           
ObjectSet(name,OBJPROP_TIME1,Time[0]);
           
ObjectSet(name,OBJPROP_TIME2,Time[Bars-1]);
           
ObjectSet(name,OBJPROP_COLOR,ResistanceColor);
           
ObjectSet(name,OBJPROP_PRICE1,atas);
           
ObjectSet(name,OBJPROP_PRICE2,bawah);
           
ObjectMove(name,0,Time[0],atas);
           
ObjectMove(name,1,Time[Bars-1],bawah);
           
}
         name
= StringConcatenate(TF(period)," DEMAND AREA");
         bawah
= SNR(period,MODE_LOW);
         atas
= bawah+Supply_Demand_Area*Point;
         ada
=false;
         
if(   (SNR(period,MODE_LOW)==SNR(60,MODE_LOW) && period>60 && SHOW_H1)
           
|| (SNR(period,MODE_LOW)==SNR(240,MODE_LOW) && period>240 && SHOW_H4)
           
|| (SNR(period,MODE_LOW)==SNR(1440,MODE_LOW) && period>1440 && SHOW_D1)
           
|| (SNR(period,MODE_LOW)==SNR(10080,MODE_LOW) && period>10080 && SHOW_W1)
           
)   ada=true;
         
if(!ada) {
           
ObjectCreate(name,OBJ_RECTANGLE,0,0,0);
           
ObjectSet(name,OBJPROP_TIME1,Time[0]);
           
ObjectSet(name,OBJPROP_TIME2,Time[Bars-1]);
           
ObjectSet(name,OBJPROP_COLOR, SupportColor);
           
ObjectSet(name,OBJPROP_PRICE1,bawah);
           
ObjectSet(name,OBJPROP_PRICE2,atas);
           
ObjectMove(name,0,Time[0],bawah);
           
ObjectMove(name,1,Time[Bars-1],atas);
           
}
     
}
avatar

Oxy

  • 11 марта 2015, 17:28
0
Здесь два советника: opentraders.ru/downloads/617/
Советник Falt_Exp1 — переносит SL в безубыток.
Советник Falt_Exp2 — тралит SL.
avatar

Oxy

  • 11 марта 2015, 16:53
0
Lagoda, комментарии слева вверху появились. Там я показываю значение mfi. (так как я не поняла, что вам конкретно хочется знать)
Файл в базе: opentraders.ru/downloads/627/
avatar

Oxy

  • 11 марта 2015, 16:32
0
Sell и buy могут быть открыты параллельно:
opentraders.ru/downloads/627/
Комментарии слева вверху появились, делала их для Lagoda, но вам они тоже буду полезны — там я указала значение mfi при открытии позиции.
avatar

Oxy

  • 11 марта 2015, 16:30
+2
Пока сделана часть: opentraders.ru/downloads/628/
Входные параметры:
TicketOrder       = 1;          // Номер ордера, на основании которого идет усреднение
K_order          
= 0.15;       // Часть объема усредняемого ордера (от 0 до 1)
Step_limit_orders
= 100;        // Шаг лимитных ордеров
Max_num_LO        
= 5;          // Max количество лимитных ордеров            
Slippage          = 30;         // Проскальзывание цены
MagicNumber       = 5677772;    // Идентификатор ордера - обязательно нужен для лимитных ордеров
// должен отличаться от магиков уже открытых ордеров!


Итак, у нас есть buy ордер (1 лот), указываем его тикет. Выставляется один buy limit.
Этот buy limit сработал:
— для всех сработавших limit модифицируются take profit по формуле, написанной вами ранее (у всех сработавших ордеров один take profit),
— и выставляется следующий buy limit (но не более max количества).
Если сработал take profit, то удаляются не сработавшие limit ордера.
И закрывается часть лота (0,15 лот) у первоначального buy ордера.
_______________________________________________________________________________________

С sell ордером тоже самое. У нас есть sell ордер (1 лот), указываем его тикет. Выставляется один sell limit.
Этот sell limit сработал:
— для всех сработавших limit модифицируются take profit по формуле, написанной вами ранее (у всех сработавших ордеров один take profit),
— и выставляется следующий sell limit (но не более max количества).
Если сработал take profit, то удаляются не сработавшие limit ордера.
И закрывается часть лота (0,15 лот) у первоначального sell ордера.
_______________________________________________________________________________________
Stop loss-а пока нет.
Проверить можно только на демо.
avatar

Oxy

  • 11 марта 2015, 15:55
0
Написала: прогоните индикатор в тестере и сами убедитесь, как он лихо перерисовывает.
avatar

Oxy

  • 11 марта 2015, 12:39
0
Индикатор этот перерисовывает (сильно). Прогоните его в тестере и сами увидите.
Плюс посмотрите эту ветку: zakaz.opentraders.ru/22110.html
avatar

Oxy

  • 11 марта 2015, 11:24
0
Сделаю, как поняла, а потом будем править. Не раньше конца недели.
avatar

Oxy

  • 11 марта 2015, 11:16
0
Fargo, я не умею догадываться ;)  Написано было: «Чтобы туда можно было их вносить»
В случае вещания в комментариях действий советника — никогда не понимала надобности комментариев, когда можно открыть и посмотреть вкладку «эксперты» и «журнал»
avatar

Oxy

  • 11 марта 2015, 11:13
0
«Если долго мучится, что-нибудь получится»
Крайне неточное утверждение.
Это как мне всегда говорили: Тише едешь — дальше будешь.
А кто-нибудь в курсе, что это только часть поговорки. Кто-нибудь в курсе, как она на самом деле звучит?
Вот так: Тише едешь — дальше будешь до того места, куда едешь.
И таких поговорок много.
Повторение — мать учение, утешение дураков.
avatar

Oxy

  • 11 марта 2015, 11:03
0
Я не знаю, как пользователь может вносить комментарии в работающий советник. Ну разве что открыть блокнот и туда записывать.
avatar

Oxy

  • 11 марта 2015, 10:59
0
AgentWeb, индикатор MFI перерисовывает, и в момент открытия позиции он был выше уровня 55. Если условие сделать, что на предыдущей свече индикатор должен быть выше уровня 55 — то на предыдущей свече уже не перерисует.
По второму условию, правильно ли я поняла, что одновременно может быть открыто две сделки — buy и sell?
avatar

Oxy

  • 11 марта 2015, 10:58
0
Когда-то тоже по-разному анализировала пару евро/бакс. Гистограммы строила в экселе. Много статистической работы было проделано в начале моего пути. Не смогу ответить — пошло ли мне это на пользу.
avatar

Oxy

  • 10 марта 2015, 23:20
0
добавлены MFI и трал:
opentraders.ru/downloads/627/
Индикатор MFI использовать только тот, что в архиве! (я его чуть дописала)
avatar

Oxy

  • 10 марта 2015, 23:13
0
Добавлю этот индикатор.

Необходимо добавить трал, так как некоторые сделки не полностью оправданы
Вы планируете
Тейкпрофит 7 пунктов
и
Стоплосс должен быть фиксированным в 5 пунктов
о каком трале может быть речь при таких мизерных параметрах?
avatar

Oxy

  • 10 марта 2015, 22:04
0
Что вы подразумеваете под:
если цена цепляет обе отлоги но при этом ордера не вылетают по тэйку либо стопу, ордера переходят без закрытия и модификации на следующую свечу
или
если цена зацепила один из ордеров но не дошла до противоположного ордера, то на следующую свечу переносится этот сработанный ордер как есть, а второй несработанный ордер удаляется
Как могут переноситься сработавшие ордера? *think* 

Не понимаю, расшифруйте:
стоп назначается всегда ордеру или ордерам, как процент просадки от депозита
Формула нужна, мне самой её не выдумать.
avatar

Oxy

  • 10 марта 2015, 21:55
0
Жду исходник индикатора (расширение mq4) Money Flow Index
avatar

Oxy

  • 10 марта 2015, 21:42
Загрузка...