[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 232

 
drknn:


Нужно программно запросить цену уровня. Для этого у Вас должен быть предварительно поставлен на график и настроен (всё программно) объект "Фибо". Это не так то просто, как кажется на первый взгляд. Хотя, не Боги горшки обжигают. Мне тож как-то пришлось подолбаться с уровнями Фибо. И сейчас заказ делаю с обработкой этих уровней. Вобщем, при желании разобраться можно.

Вот Вам пример кода по созданию фибо на графике.

Для запроса цены уровня мне пришлось делать подпрограмму. Вот она (при желании разберётесь что к чему)

Т.е. к вееру фибоначи надо еще объект фибо программно добавлять и только так узнавать цену уровня. Я правильно понял?
 
fury2006:
Т.е. к вееру фибоначи надо еще объект фибо программно добавлять и только так узнавать цену уровня. Я правильно понял?
Не обязательно вешать на график стандартный объект фибо. Можно просто программно рассчитать все уровни фибо, исходя из существующих условий,
занести их в переменные или массив и сравнивать цену с этими, рассчитанными собственно вами, уровнями. Я именно так делаю... Хотя - всё ИМХО.
 
artmedia70:
Не обязательно вешать на график стандартный объект фибо. Можно просто программно рассчитать все уровни фибо, исходя из существующих условий,
занести их в переменные или массив и сравнивать цену с этими, рассчитанными собственно вами, уровнями. Я именно так делаю... Хотя - всё ИМХО.
А можете пожалуйста пример кода написать?
 
fury2006:
А можете пожалуйста пример кода написать?
А он посложнее будет того, который вам Владимир предложил... :))
 
artmedia70:
А он посложнее будет того, который вам Владимир предложил... :))
ну может он мне больше понравится :) И к тому же нежелательно наличие доп. объектов на экране. там и так дофига объектов будет и лишние только мешать будут
 
fury2006:
ну может он мне больше понравится :) И к тому же нежелательно наличие доп. объектов на экране. там и так дофига объектов будет и лишние только мешать будут

Мой код жестко привязан к данным, получаемым именно тем советником, для которого он и писался. Функция является только частью необходимых вычислений и для вас не будет представлять какой-либо практической ценности - только в кач-ве учебного пособия для самостоятельного осмысления. И то совместно с остальным кодом, где производятся все предварительные рассчёты.

Если бы я его делал универсальным - работал бы медленнее, а мне того не надоть... :)

Впрочем - пожалуйста. Ф-ция переписана с Екселя, где я её рассчёты проверял. В неё передаются два параметра - излом ЗигЗага (нижний, либо верхний, в зав-ти от типа открываемой позиции) и цновой уровень 23.6 фибы. Фиба строится не так, как общепринято, а считается, что цена пробила уровень 23.6 фибы и находится выше уровня консолидации, рассчитанного заранее. Ноль фибы ставится на излом ЗЗ, а на 23.6 (при её пробитии) открывается поза. Остальные уровни вписываются в переменные, объявленные на глобальном уровне и впоследствии вносятся в массив учёта ордеров, откуда и берутся уровни для любой открытой позиции.

//=========================================================================================================
void CalcFiboLevel(double priceZZ, double price23)   // Рассчитывает уровни Фибы по нулевому и 23.6 значениям цен
{
   double A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,
          B2,B3,B4,B5,B6,B7,B8,B9,B10,B11;
   
   A2 = 0;                                      // Уровни фибы  
   A3 = 23.6;
   A4 = 38.2;
   A5 = 50.0;
   A6 = 61.8;
   A7 = 78.6;
   A8 = 100.0; 
   A9 = 161.8;  
   A10= 261.8; 
   A11= 423.6;    
   B2 = priceZZ;                                // Цена нулевого уровня фибы (нижний/верхний перелом ЗигЗага)
   B3 = price23;                                // Цена уровня 23.6 фибы (цена открытия позы)
   B4 = ((B3-B2) *(A4-A2) +(A3-A2) *B2)/(A3 -A2);
   B5 = ((B4-B3) *(A5-A3) +(A4-A3) *B3)/(A4 -A3);
   B6 = ((B5-B4) *(A6-A4) +(A5-A4) *B4)/(A5 -A4);
   B7 = ((B6-B5) *(A7-A5) +(A6-A5) *B5)/(A6 -A5);
   B8 = ((B7-B6) *(A8-A6) +(A7-A6) *B6)/(A7 -A6);
   B9 = ((B8-B7) *(A9-A7) +(A8-A7) *B7)/(A8 -A7);
   B10= ((B9-B8) *(A10-A8)+(A9-A8) *B8)/(A9 -A8);
   B11= ((B10-B9)*(A11-A9)+(A10-A9)*B9)/(A10-A9);
   
   
   Fibo38_Price  = B4;                         // ((B3-B2)*(A4-A2)+(A3-A2)*B2)/(A3-A2)
   Fibo50_Price  = B5;                         // ((B4-B3)*(A5-A3)+(A4-A3)*B3)/(A4-A3)
   Fibo61_Price  = B6;                         // ((B5-B4)*(A6-A4)+(A5-A4)*B4)/(A5-A4)
   Fibo78_Price  = B7;                         // ((B6-B5)*(A7-A5)+(A6-A5)*B5)/(A6-A5)
   Fibo100_Price = B8;                         // ((B7-B6)*(A8-A6)+(A7-A6)*B6)/(A7-A6)
   Fibo161_Price = B9;                         // ((B8-B7)*(A9-A7)+(A8-A7)*B7)/(A8-A7)
   Fibo261_Price = B10;                        // ((B9-B8)*(A10-A8)+(A9-A8)*B8)/(A9-A8)
   Fibo423_Price = B11;                        // ((B10-B9)*(A11-A9)+(A10-A9)*B9)/(A10-A9)

   return;
}

А вот по её использованию - нужно весь советник распотрошить, чтобы понятно стало...

 
artmedia70:

Мой код жестко привязан к данным, получаемым именно тем советником, для которого он и писался. Функция является только частью необходимых вычислений и для вас не будет представлять какой-либо практической ценности - только в кач-ве учебного пособия для самостоятельного осмысления. И то совместно с остальным кодом, где производятся все предварительные рассчёты.

Если бы я его делал универсальным - работал бы медленнее, а мне того не надоть... :)

Впрочем - пожалуйста. Ф-ция переписана с Екселя, где я её рассчёты проверял. В неё передаются два параметра - излом ЗигЗага (нижний, либо верхний, в зав-ти от типа открываемой позиции) и цновой уровень 23.6 фибы. Фиба строится не так, как общепринято, а считается, что цена пробила уровень 23.6 фибы и находится выше уровня консолидации, рассчитанного заранее. Ноль фибы ставится на излом ЗЗ, а на 23.6 (при её пробитии) открывается поза. Остальные уровни вписываются в переменные, объявленные на глобальном уровне и впоследствии вносятся в массив учёта ордеров, откуда и берутся уровни для любой открытой позиции.

А вот по её использованию - нужно весь советник распотрошить, чтобы понятно стало...

офигенно, ты мне мысль подал
 

Всем здрасте! Помогите пожалуйста объединить следующие вещи. В итоге должно получиться: две линии следующие за ценой одна ниже Ask на 20п.,

другая-выше, а так же подается звуковой сигнал при изменении цены на 20п. за 1 тик.

По отдельности все работает шикарно, а соединить воедино не могу. Заранее спасибо!

1) Линия ниже Ask на 20п.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask-20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask-20*Point);
return(0);
}

//+------------------------------------------------------------------+

2) Линия выше Ask на 20п.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

//+------------------------------------------------------------------+

3) Скорость изменения цены во времени.

#property show_inputs

extern int pips=2; //изменение аск
extern double Time_=0.1; //c. ~ tick
extern bool все_из_обзора_рынка=true; // только текущий символ - false

int i, l, p, количество_символов;
string val[], на_экран;
int Ask_save[];

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void start(){
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
ArrayResize(Ask_save,количество_символов);
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}
if(!все_из_обзора_рынка){
количество_символов=1;
ArrayResize(Ask_save,количество_символов);
ArrayResize(val,количество_символов);
val[0]=Symbol();
}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим

Alert("пересчитаем через "+Time_+" сек.");

for(i=0;i<количество_символов;i++){//посчитаем стоимость спреда для инструментов из обзора рынка
if((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT))>=pips){
Alert(val[i]+","+Period()+" изменился вниз на "+DoubleToStr((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)),0)+" pips");
PlaySound("timeout.wav");
}
if((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i])>=pips){
Alert(val[i]+","+Period()+" изменился вверх на "+DoubleToStr((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i]),0)+" pips");
PlaySound("email.wav");
}
Ask_save[i]=MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT);
}
Sleep(Time_*1000);//пауза сек.
}

/*
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим
на_экран="\r\n"; //отступ
for(i=0;i<количество_символов;i++)//посчитаем стоимость спреда для инструментов из обзора рынка
на_экран=на_экран+val[i]+" стоимость спреда = " + DoubleToStr(MarketInfo(val[i],MODE_SPREAD)*MarketInfo(val[i],MODE_TICKVALUE),0)+"\r\n";
Comment(на_экран);//выведем на экран
Alert("Пересчитаем");//сигнал
Sleep(3000);//пауза 3 сек.
}
*/
}
void deinit(){Comment("");}
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=


//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// функция читает из обзора рынка все фин.инстр.
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
int SymbolsList(string &Symbols[], bool Selected){
int Offset, SymbolsNumber; string SymbolsFileName;
if(Selected) SymbolsFileName = "symbols.sel"; else SymbolsFileName = "symbols.raw";
int hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ);
if(hFile < 0) return(-1); if(Selected) { SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116; }
else { SymbolsNumber = FileSize(hFile) / 1936; Offset = 1924; }
ArrayResize(Symbols, SymbolsNumber);
if(Selected) FileSeek(hFile, 4, SEEK_SET);
for(int i = 0; i < SymbolsNumber; i++){Symbols[i] = FileReadString(hFile, 12); FileSeek(hFile, Offset, SEEK_CUR);}
FileClose(hFile);
return(SymbolsNumber);
}
 

Объясните пожалуйста, почему данный код иногда застывает на одном месте, и чтобы возобновить его приходиться перезагружать терминал?

int ticket,err;
         Alert("nachalo");
         ticket = OrderSend(Symbol (), OP_BUY, 1, Ask, 10,0,0, "dsgdsf", 0, 0, CLR_NONE);
         err = GetLastError();
         Alert (err);
         Alert("konec");
         OrderClose (ticket,1,Bid,5,CLR_NONE);
         Alert ("zakrito");
 
globad:

Всем здрасте! Помогите пожалуйста объединить следующие вещи. В итоге должно получиться: две линии следующие за ценой одна ниже Ask на 20п.,

другая-выше, а так же подается звуковой сигнал при изменении цены на 20п. за 1 тик.

По отдельности все работает шикарно, а соединить воедино не могу. Заранее спасибо!

1) Линия ниже Ask на 20п.

2) Линия выше Ask на 20п.

3) Скорость изменения цены во времени.


Похоже, надоело уже... Элементарно же, Ватсон:

ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask-20*Point) ;

Это имя одной линии.

Подсказка: посмотрите имя второй линии. Оно отличается от первой?

Да и зачем постоянно строить уже построенный объект?

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

//+------------------------------------------------------------------+

А теперь посмотрите на разницу:

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
if (ObjectFind("MyPriceLine")<0) ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

//+------------------------------------------------------------------+
Причина обращения: