ВОЗМОЖНО ЛИ запрограммировать данный алгоритм. Голова кипит третью неделю!

 

Добрый день! Пытаюсь запрограммировать алгоритм, работает но не до конца не открывает ордер sell при сравнении цен. Помогите голова кипит уже третью неделю! Код не буду свой скидавать потому что уже как только не пробовал писать все не получается уже каша в кодах. Прошу скажите возможно ли осуществить данную программу? И если не затруднит скинте код буду очень благодарен!!!

Программа: Открывается ордер Buy, берем цену открытия ордера Buy и сравниваем ее с ценой Bid и в том случае когда цена открытия ордера Buy будет равна цене Bid открывается ордер Sell по цене открытия ордера Buy.

 
m8akca:

Добрый день! Пытаюсь запрограммировать алгоритм, работает но не до конца не открывает ордер sell при сравнении цен. Помогите голова кипит уже третью неделю! Код не буду свой скидавать потому что уже как только не пробовал писать все не получается уже каша в кодах. Прошу скажите возможно ли осуществить данную программу? И если не затруднит скинте код буду очень благодарен!!!

Программа: Открывается ордер Buy, берем цену открытия ордера Buy и сравниваем ее с ценой Bid и в том случае когда цена открытия ордера Buy будет равна цене Bid открывается ордер Sell по цене открытия ордера Buy.

  double  OrderOpenPrice(); Функция определения цены открытия ордера, предварительно нужно выбрать ордер функцией bool  OrderSelect();

  второе действие    double  MarketInfo(NULL,MODE_BID); 

  третье действие    : сравниваешь первое со вторым, условие сработало значит открываешь ордер, просто возможно ты ошибочно задаёшь цену открытия, типа не bid  а  ask 


 
ara66676:

  double  OrderOpenPrice(); Функция определения цены открытия ордера, предварительно нужно выбрать ордер функцией bool  OrderSelect();

  второе действие    double  MarketInfo(NULL,MODE_BID); 

  третье действие    : сравниваешь первое со вторым, условие сработало значит открываешь ордер, просто возможно ты ошибочно задаёшь цену открытия, типа не bid  а  ask 


 

Ниже код, не работает оператор if условие в нем priceb==cli, хотя даные по переменным показываются в коментарии т.е. они есть но не сравниваются почему то.

 

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

input double L=0.01;
input int TakeProfit = 150;
input int StopLoss   = 150;
input int  Magic     = 0;

//+------------------------------------------------------------------+
int b=0;
int s=0;
double priceb=0.00000;
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()

  {

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

//| Открываем ордер Buy                                              |

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

   if(b==0)

     {

      b=My_Fun_b();
     }
//+------------------------------------------------------------------+
//| Открываем ордер Sell                                             |
//+------------------------------------------------------------------+
   if(s==0)
     {
     priceb=My_Fun_p();
     double cli=MarketInfo(_Symbol,MODE_BID);
      Comment("Цена ордера Buy",priceb,"\n""Bid",cli);
      if(priceb==cli)
      {
      Print("УСЛОВИЕ ВЫПОЛНЕНО");     
    My_Fun_s(priceb);
    }
     }
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Пользовательская Функция открытия первого ордера (buy)           |
//+------------------------------------------------------------------+
int My_Fun_b()
  {
   b=OrderSend(_Symbol,0,0.01,Ask,0,0,0,"",414,0,clrBlue);
   return(b);
  }
//+------------------------------------------------------------------+
//| Пользовательская функция определенияцены первого ордера (buy)    |
//+------------------------------------------------------------------+
double My_Fun_p()
  {
   double pb=0;
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true)
      if(OrderMagicNumber()==414)
        {
         pb=OrderOpenPrice();
        }
   return(pb);
  }
//+------------------------------------------------------------------+
//| Пользовательская Функция открытия первого ордера (sell)          |
//+------------------------------------------------------------------+
double My_Fun_s(double P)
  {
  double Lots;
  Lots=P;
   s=OrderSend(_Symbol,1,0.01,P,0,0,0,"",415,0,clrRed);
   return(s);
  }
//+------------------------------------------------------------------+
 

а у тебя всё в порядке вот в этой строчке????

s=OrderSend(_Symbol,1,0.01,P,0,0,0,"",415,0,clrRed); 

пересмотрел ещё раз код, вроде нормально всё в строчке....

есть вероятность что переменная не нормализована и при вызове твоей функции на открытие ордера сел вместо цены  ask попадает число не размера котировки, а к примеру с колличеством знаков больше чем в котировке....

типа  ask реальный 1,12345  а число которое идёт в функцию 1,123450000000

 
ara66676:

а у тебя всё в порядке вот в этой строчке????

s=OrderSend(_Symbol,1,0.01,P,0,0,0,"",415,0,clrRed)


Да здесь тоже проблемка не знаю как правильно передать в функцию цену открытого ордера Buy

double My_Fun_s(priceb); вызываю функцию и передаю переменную с ценной открытого ордера

double My_Fun_s(double P) функция с переменной открытого ордера

  {

  double Lots;

  Lots=P;

   s=OrderSend(_Symbol,1,0.01,Lots,0,0,0,"",415,0,clrRed);

   return(s);

  } 

Также правильно оформлена функция?


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

if(priceb==cli)

      {

      Print("УСЛОВИЕ ВЫПОЛНЕНО");     

    My_Fun_s(priceb);

    } 

 
ara66676:

а у тебя всё в порядке вот в этой строчке????

s=OrderSend(_Symbol,1,0.01,P,0,0,0,"",415,0,clrRed); 

я вот думаю может условие ни как не срабатывает потому что цены не совпадают пока выполняется программа цена меняется (хоть до этого и совпадала не один раз), может надо воспользоваться функцией Refreshratec правда сколько раз пробовал ее вставлять хрень какая то получается то график зависает то еще что-нибудь не умею я ей пользоваться и описания нормального найти с примерами не могу, вот если бы мне ее кто-нибудь вставил правильно может заработала.
 

 double cli=NormalizeDouble(MarketInfo(_Symbol,MODE_BID),5); здесь 5 означает сколько знаков после запятой в котировке....

priceb=NormalizeDouble(My_Fun_p(),5); тоже самое.....

 
m8akca:
я вот думаю может условие ни как не срабатывает потому что цены не совпадают пока выполняется программа цена меняется (хоть до этого и совпадала не один раз), может надо воспользоваться функцией Refreshratec правда сколько раз пробовал ее вставлять хрень какая то получается то график зависает то еще что-нибудь не умею я ей пользоваться и описания нормального найти с примерами не могу, вот если бы мне ее кто-нибудь вставил правильно может заработала.

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

 
ara66676:

 double cli=NormalizeDouble(MarketInfo(_Symbol,MODE_BID),5); здесь 5 означает сколько знаков после запятой в котировке....

priceb=NormalizeDouble(My_Fun_p(),5); тоже самое.....

Спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ЗАРАБОТАЛО!!!! УРА ТОВАРИЩИ СЛАВА ARA66676!!!! СЛАВА!!!
 
m8akca:
Спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ЗАРАБОТАЛО!!!! УРА ТОВАРИЩИ СЛАВА ARA66676!!!! СЛАВА!!!

не забывай что бывают котировки 4-х значные, и бывают валютные пары типа с jpy там тоже или 3-х или 2-х значные.... так что ту цифру лучше сделать переменной....

 
ara66676:

не забывай что бывают котировки 4-х значные, и бывают валютные пары типа с jpy там тоже или 3-х или 2-х значные.... так что ту цифру лучше сделать переменной....

 

Её с успехом заменит _Digits
Причина обращения: