Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 756

 
ssn1:
Я привык к собственной системе архивации.
Я уже с Хранилещем благополучно пережил: уничтожение жёсткого диска на ПК, выход из строя ноутбука. И при этом не потерял ни байта своего кода. Хранилище - это удобно. 
 

Добрый день.

Написал программку-упражнение. Почему-то не работает.

Тестировал в тестере стратегий в период от 29 сентября до 15 октября.

Программа должна работать так: совершается покупка. Когда цена упадет на 0.010 должна произойти продажа с убытком.

Покупка происходит. Продажа не происходит. Включаю визуализацию, вижу, что появляется цена ниже не то, что на 0.010, но и значительно больше. Странно.

// -------- переменные --- Начало -----
extern double L1=0.01;             // размер лота для покупки
extern double L1n=0.01;           // размер лота для покупки (нормализованный лот)
extern double AktualAsk=0.0;    // актуальная цена покупки
extern double AktualBid=0.0;    // актуальная цена продажи
extern int ticketlackmus=1;       // индикатор успешности откарытия ордера
extern int ticket1=0;                 // тикет
extern bool PozOtk1=true;
// -------- переменные --- Конец -----
int init()
   {
      return(0);
   }


int start()   
   {
      if (PozOtk1==true)
         {    
// Открытие позиции
             ticketlackmus=1;
             while (ticketlackmus>0)
                {
     Alert (" Открытие первой позиции ");
                   RefreshRates();                                        // Обновление данных
                   AktualAsk=NormalizeDouble(Ask,Digits); //для цены
                   L1n=NormalizeDouble(L1,2); //для лота.
                   ticket1=OrderSend ("GBPUSD", OP_BUY, L1n, AktualAsk, 5, 0, 0, 0, 0, CLR_NONE);   
                   if (ticket1>0) ticketlackmus=-1;
                   {
                   Alert (" ОРДЕР ОТКРЫТ ", ticket1, "  ", ticketlackmus);
                   }
                }
             PozOtk1=false;
             Alert (" PozOtk1 ", PozOtk1);
          }

      RefreshRates();                                        // Обновление данных
      AktualBid=NormalizeDouble(Bid,Digits); //для цены
        if (AktualBid<=AktualAsk-0.010 && PozOtk1==false)
       {                             
                     RefreshRates();    // Обновление данных
                     OrderSelect(ticket1, SELECT_BY_TICKET);  
                     L1n=NormalizeDouble(L1,2); //для лота
                     OrderClose (ticket1, L1n, AktualBid, 5);
                     PozOtk1=true;
       }

return(0);
   }

int deinit()                                  
   {
      return(0);
   }


Ozero.

 

Пожалуйста, при вставке кода, пользуйтесь волшебной кнопкой SRC:

Правильно вставляем код на форуме 

 
// -------- переменные --- Н -----
extern double L1=0.01;            // размер лота для покупки 
extern double L1n=0.01;           // размер лота для покупки 
extern double AktualAsk=0.0;
extern double AktualBid=0.0;
extern int ticketlackmus=1;       // "лакмусовая бумажка" успешности откарытия ордера
extern int ticket1=0;             // тикет 
extern bool PozOtk1=true;
// -------- переменные --- К ----- 
int init() 
   {
      return(0);
   }


int start()    
   {
      if (PozOtk1==true) 
         {     
// Открытие позиции
             ticketlackmus=1;
             while (ticketlackmus>0)
                {
     Alert (" Открытие первой позиции ");
                   RefreshRates();                                        // Обновление данных 
                   AktualAsk=NormalizeDouble(Ask,Digits); //для цены
                   L1n=NormalizeDouble(L1,2); //для лота.
                   ticket1=OrderSend ("GBPUSD", OP_BUY, L1n, AktualAsk, 5, 0, 0, 0, 0, CLR_NONE);    
                   if (ticket1>0) ticketlackmus=-1;
                   {
                   Alert (" ОРДЕР ОТКРЫТ ", ticket1, "  ", ticketlackmus);
                   }
                }
             PozOtk1=false; 
             Alert (" PozOtk1 ", PozOtk1);
          }

      RefreshRates();                                        // Обновление данных 
      AktualBid=NormalizeDouble(Bid,Digits); //для цены
           if (AktualBid<=AktualAsk-0.010 && PozOtk1==false)
       {                              
                     RefreshRates();    // Обновление данных 
                     OrderSelect(ticket1, SELECT_BY_TICKET);   
                     L1n=NormalizeDouble(L1,2); //для лота
                     OrderClose (ticket1, L1n, AktualBid, 5);
                     PozOtk1=true; 
       }

return(0);
   }



int deinit()                                   
   {
      return(0);
   } 

 

Если позиция открывается на конкретном символе (в данном случае -  "GBPUSD"), то желательно все данные брать тоже по этому символу через маркетинфо, то есть не просто AktualAsk=NormalizeDouble(Ask,Digits);AktualAsk=MarketInfo( "GBPUSD",MODE_ASK);

И так следует брать любые рыночные данные, во избежание.

 
// -------- переменные --- Н -----
extern double L1=0.01;            // размер лота для покупки 
extern double L1n=0.01;           // размер лота для покупки 
extern double AktualAsk=0.0;
extern double AktualBid=0.0;
extern int ticketlackmus=1;       // "лакмусовая бумажка" успешности откарытия ордера
extern int ticket1=0;             // тикет 
extern bool PozOtk1=true;
// -------- переменные --- К ----- 
int init() 
   {
      return(0);
   }


int start()    
   {
      if (PozOtk1==true) 
         {     
// Открытие позиции
             ticketlackmus=1;
             while (ticketlackmus>0)
                {
     Alert (" Открытие первой позиции ");
                   RefreshRates();                                        // Обновление данных 
                   //AktualAsk=NormalizeDouble(Ask,Digits); //для цены
                   AktualAsk=MarketInfo( "GBPUSD",MODE_ASK);
                   L1n=NormalizeDouble(L1,2); //для лота.
                   ticket1=OrderSend ("GBPUSD", OP_BUY, L1n, AktualAsk, 5, 0, 0, 0, 0, CLR_NONE);    
                   if (ticket1>0) ticketlackmus=-1;
                   {
                   Alert (" ОРДЕР ОТКРЫТ ", ticket1, "  ", ticketlackmus);
                   }
                }
             PozOtk1=false; 
             Alert (" PozOtk1 ", PozOtk1);
          }

      RefreshRates();                                        // Обновление данных 
      AktualBid=NormalizeDouble(Bid,Digits); //для цены
           if (AktualBid>=AktualAsk+0.010 && PozOtk1==false)
       {                              
                     RefreshRates();    // Обновление данных 
                     OrderSelect(ticket1, SELECT_BY_TICKET);   
                     L1n=NormalizeDouble(L1,2); //для лота
                     OrderClose (ticket1, L1n, AktualBid, 5);
                     PozOtk1=true; 
       }

return(0);
   }



int deinit()                                   
   {
      return(0);
   } 
evillive:

Если позиция открывается на конкретном символе (в данном случае -  "GBPUSD"), то желательно все данные брать тоже по этому символу через маркетинфо, то есть не просто AktualAsk=NormalizeDouble(Ask,Digits);AktualAsk=MarketInfo( "GBPUSD",MODE_ASK);

И так следует брать любые рыночные данные, во избежание.

Спасибо, Evillive!

Произвел изменения. Но, покупка и так происходила. После изменений продажа не происходит. Тест М15 от 30 сентября 2014 по середину октября.



 
Ozero:

Спасибо, Evillive!

Произвел изменения. Но, покупка и так происходила. После изменений продажа не происходит. Тест М15 от 30 сентября 2014 по середину октября.



Найдите где в приведенном коде может быть продажа
 
OrderClose (ticket1, L1n, AktualBid, 5);
 
Ozero:
Это закрытие ордера. Где открытие ордера на продажу. В приведенном коде его нет
 
Я и имел в виду, что ордер не закрывается :( Сорри, что не так выразился, новичок еще.