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

 
hoz:

Вадим, я бы сделал так же как Вы отписали! Поэтому я и задал вопрос. Думал, может я что не учёл. Пока ещё наблюдаю за своей логикой, и за логикой других программистов. Так как кроме основной логики, вижу, что нужно учитывать ряд факторов.

RefreshRates() обновляет историю в потоке эксперта. MarketInfo() берёт данные с сервера. Обновлять не требуется. Лишний тормоз.

Если обновлять надо, то простой вызов  RefreshRates() может ничего не дать. Надо как-то контроллировать и обрабатывать событие прихода всей истории.

 
привет как пользоваться программой metaeditor?
 
crespo1985:
привет как пользоваться программой metaeditor?


Ну здаров! Как хочешь, так и пользуйся! Вам не сюда с такими вопросами.. Тут форум программистов..

 

Zhunko:

RefreshRates() обновляет историю в потоке эксперта. MarketInfo() берёт данные с сервера. Обновлять не требуется. Лишний тормоз.

Если обновлять надо, то простой вызов  RefreshRates() может ничего не дать. Надо как-то контроллировать и обрабатывать событие прихода всей истории.

Да. Я так понимаю, RefreshRates() обновляет рыночные данные (их историю до текущего времени), и далее переменная рыночного окружения использует последнее из полученных значении. На сколько я понимаю, это единственный логичный вариант. По сему, эта функция написано будет проще и шустрее, и, логичнее, и практичнее, и надёжнее, вот так?

 

double fGet_TradePrice(int fi_price,    // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }
}
 
hoz:

Да. Я так понимаю, RefreshRates() обновляет рыночные данные (их историю до текущего времени), и далее переменная рыночного окружения использует последнее из полученных значении. На сколько я понимаю, это единственный логичный вариант. По сему, эта функция написано будет проще и шустрее, и, логичнее, и практичнее, и надёжнее, вот так?

Я бы так:

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

 Для обновления истории надо отдельную функцию писать.

 

2 часа пытаюсь написать тестовый кусок, для дальнейшего тестирования разных условий. 

Не работает!

подскажите ошибку пожалуйста

int mm;


if (mm==0) { B=Bid; mm=1;} 

OrderSelect(0,SELECT_BY_POS,MODE_TRADES); 

if ( (Bid> B+0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_SELL) ) { My_close(); My_buy (); My_modify(); }  

if ( (Bid< B-0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_BUY ) ) {My_close(); My_sell (); My_modify(); }
  

 смысл чтобы ордера открывались по прошествии 2пп в свою сторону. 

открывается sell и с концами... 

 

Доброго дня!  Простите за банальность. Строки из робота, робот у меня уже не первый год, и в принципе цикл такого вида неизмено кочует из одного в другой.

 for(int i=OrdersTotal()-1;i>=0;i--) 
      {  if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)

 А почему у меня ордерс тотал минус один? А верно ли, что цикл идет на уменьшение переменной и?

 

функция Кима имеет параметра время = "Дата и время в секундах с 1970 года"

я пробовал 2 варианта

и оба выдают профит не за текущий  день, а полный профит по всей истории....

 

int t=(     TimeCurrent()-( (Hour()*3600) +(Minute()*60)+Seconds()   ) ); 
int t=(    (Hour()*3600) +(Minute()*60)+Seconds()    ); 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}
 
Dimka-novitsek:

Доброго дня!  Простите за банальность. Строки из робота, робот у меня уже не первый год, и в принципе цикл такого вида неизмено кочует из одного в другой.

 А почему у меня ордерс тотал минус один? А верно ли, что цикл идет на уменьшение переменной и?

Цикл считает индекс от 0 до Тотал-1 или от Тотал-1 до 0. Потому нужен знак минуса или знак меньше < .
 
Zhunko:

Я бы так:

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

Через получать данные через  MarketInfo() даже для инструмента данного окна по-моему будет накладно по ресурсам, Вы так не считаете? 

Zhunko:

 Для обновления истории надо отдельную функцию писать.


 Я не совсем понимаю логики написания отдельной функции. Ведь функция RefreshRates() сама по себе служит для обновления данных предопределённых переменных. А Bid и Ask это, как раз-таки и есть предопределённые переменные.  Если функция RefreshRates() обновляет предопределённые переменные, то зачем писать какую-то дополнительную функцию?Можно пояснить?
 
Спасибо!!
Причина обращения: