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

 
iruogl:

Я новичок.

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

Спасибо  всем за советы.

 


В общем я тоже новичок, но думаю надо объявить переменную типа datetime  на глобальном уровне (например datetime  TIME;) , в init()  присвоить ей значение времени открытия последнего бара,  в   начале start()  проводить проверку, если   TIME== Time[0]  --   return(0); , если нет --   TIME= Time[0]; . В этом случае эксперт будет выполнять ф-ю   start()толко один раз при открытии нового бара.
 
paladin80:
Любые числа можно сравнивать между собой с помощью >= и <=. После нормализации NormalizeDouble уже можно сравнивать как == или !=. Однако, тут надо смотреть есть ли смысл так сравнивать числа напр. с 10 знаками после запятой, просто нереально найти ситуацию когда они были бы равны или неравны.

Большое спасибо за ответ.  Уточняю вопрос: после нормализации число в памяти компьютера остается тем же и изменяется только его представление. или изменяется само число?
 
rigonich:

Большое спасибо за ответ.  Уточняю вопрос: после нормализации число в памяти компьютера остается тем же и изменяется только его представление. или изменяется само число?

После нормализации число меняется, напр.:

double var1=0.123456789;
double var2=NormalizeDouble(var1,5); // var2=0.12346

Другое дело когда выводите на печать, с помощью DoubleToStr, напр.:

double var1=0.123456789;
Print("var1 = ",DoubleToStr(var1,5)); // Выход: var1=0.12345

А если после нормализации выведёте на печать, то будет так:

double var1=0.123456789;
double var2=NormalizeDouble(var1,5);  // var2=0.12346
Print("var2 = ",DoubleToStr(var2,5)); // Выход: var2=0.12346
 
paladin80:

Эта функция определяет только момент появления свечи. Чтобы найти цену открытия используйте iOpen. Что-то типа такого:


Спасибо, Вы очень помогли
 
okvseok:

Подскажите, пожалуйста!

Есть возможность распечатать один лист, но как выставить, чтоб началась печать листов с определенной даты и до определенной даты. Чтоб по одному листу не печатать.

Спасибо! 



игнор)
 
Доброго дня! Вы знаете, у меня что-то не работает скррипт. Кидаю (перетягиваю) на график- вообще ничего не происходит.
 
Старт выполняется неизбежно на каждом тике, но в нем можно предусмотреть необходимые условия.
 
Доброго дня! Вы знаете, у меня что-то не работает скррипт. Кидаю (перетягиваю) на график- вообще ничего не происходит. Как его использовать?? 
//+------------------------------------------------------------------+
//|                                                      Покупка.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
for(int i=0;i<=OrdersTotal();i++){
   if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
 { if(OrderSymbol() != Symbol()) continue; 
   if(OrderType()==OP_SELL) 
  OrderClose(OrderTicket(),OrderLots(),Ask,6,Red);
   if(OrderType()==OP_BUY)
  OrderClose(OrderTicket(),OrderLots(),Bid,6,Red);
   if(OrderType()>=2)
  OrderDelete(OrderTicket());}} 
//----
   for(i=0;i<23;i++){
    Sleep(2000);RefreshRates(); if(!IsTradeAllowed())continue;
    int tiket=OrderSend(Symbol(),OP_BUY,0.1,Ask,6,0,0,"Skript",98600,0,Blue);
   if( tiket!=-1)break;
   if (tiket==-1){ int Error=GetLastError();  
            string errorcomment = "Ошибка открытия  ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);}}
//----
   return(0);
  }
//+------------------------------------------------------------------+

//------- :  Коды ошибок
string ErrorDescript(int error_code){string error_string;switch(error_code){
      //---- Коды ошибок, возвращаемые торговым сервером:
      case 0:   error_string="Нет ошибок";                                                                                             break;
      case 1:   error_string="Нет ошибки, но результат неизвестен";                                                                    break;
      case 2:   error_string="Общая ошибка";                                                                                           break;
      case 3:   error_string="Неправильные параметры";                                                                                 break;
      case 4:   error_string="Торговый сервер занят";                                                                                  break;
      case 5:   error_string="Старая версия клиентского терминала";                                                                    break;
      case 6:   error_string="Нет связи с торговым сервером";                                                                          break;
      case 7:   error_string="Недостаточно прав";                                                                                      break;
      case 8:   error_string="Слишком частые запросы";                                                                                 break;
      case 9:   error_string="Недопустимая операция нарушающая функционирование сервера";                                              break;
     
 
paladin80:

После нормализации число меняется, напр.:

Другое дело когда выводите на печать, с помощью DoubleToStr, напр.:

А если после нормализации выведёте на печать, то будет так:


Спасибо.
 

Добрый день.

Надо рассчитать суммарный профит только последних двух buy позиции. Как переделать код?

double profits_buy_2pos()
{
   double pr_buy = 0;
   int cnt = 0;
   int OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType() == OP_BUY)
          {     
          if (OrderType()==OP_BUY) 
          {
            pr_buy+= OrderProfit();
          } 
          }                               
   } 
return(pr_buy);   
}
Причина обращения: