Автор Тема: Просты функции для конструирования советников ...  (Прочитано 8431 раз)

0 Пользователей и 1 Гость просматривают эту тему.

16 Январь 2013, 09:27:32
Прочитано 8431 раз

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
В данной теме рассмотрим и поможем в составлении кода из простых функций


//--------------------------------------------------------------------------------------//
//   typ("",-1,-1); Функция возвращает тип последнего закрытого ордера
//   "" инструмент,( -1 все меджики || >-1 по заданному меджику)
//--------------------------------------------------------------------------------------//
int typ(string t, int m)
{  datetime z=0 ; int p=-1,i; string sym="";
   int d=OrdersHistoryTotal();
   if ( t=="") sym=Symbol();else sym=t;
   for( i=0;i<=d;i++)
   if ( OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) )                     
   if ( (OrderSymbol() == sym ) && ( OrderMagicNumber() == m || m==-1 )&&OrderType()<=1 )
   if ( OrderCloseTime()>z) 
   {
   z =OrderCloseTime();
   p =OrderType();
   }
return(p);



//--------------------------------------------------------------------------------------//
//   ordermod (-1,-1,-1,-1); Функция модифицирует ордер
//   Тиккет, цена , стоп лосс, тейк профит
//--------------------------------------------------------------------------------------// 
bool ordermod(int t,double c, double sl, double tp) 
{  double op=0;
   if (OrderSelect(t,SELECT_BY_TICKET)==true){
   if (c==-1 )c =OrderOpenPrice();
   if (sl==-1)sl=0;else sl=NormalizeDouble(sl*Point,Digits);
   if (tp==-1)tp=0;else tp=NormalizeDouble(tp*Point,Digits);
   op=NormalizeDouble(OrderOpenPrice(),Digits);
   if (OrderType()==0||OrderType()==2||OrderType()==4)
      return(OrderModify(t,c,op-sl,op+tp,0,Green));
   if (OrderType()==1||OrderType()==3||OrderType()==5)
      return(OrderModify(t,c,op+sl,op-tp,0,Green)); }}


//--------------------------------------------------------------------------------------//
//   openorders ("",-1,-1,-1,0); Функция открывает ордер
//   "" инструмент, >-1 тип оордера , -1 лот, -1 цена, 0 по заданному меджику)
//--------------------------------------------------------------------------------------// 
int openorders (string t,int x, double lot, double price, int m )
{  string sym=""; int z=0 ;
   if ( t=="") sym=Symbol(); else sym = t ;
   if ( x==0 ) price=NormalizeDouble( Ask,Digits );
   if ( x==1 ) price=NormalizeDouble( Bid,Digits );
   return(OrderSend(sym,x,lot,price,Slip,0,0,""+WindowExpertName(),m,0,Green));}



//--------------------------------------------------------------------------------------//
//   profhistory("",-1,-1); Функция возвращает профит последнего закрытого ордера
//   "" инструмент,( >-1 тип оордера, -1 все типы ),( -1 все меджики || >-1 по заданному меджику)
//--------------------------------------------------------------------------------------//
double profhistory(string t,int x, int m)
{  string sym=""; int z=0 ; double prof=0;
   if ( t=="") sym=Symbol(); else sym = t ;
   for( int i=OrdersHistoryTotal()-1; i>=0; i-- )               
   if ( OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == true )                       
   if ( OrderSymbol() == sym && (OrderMagicNumber() == m || m==-1 ) && OrderType()<=1)
   if ( x == -1 || OrderType() == x )
   if ( OrderCloseTime()>z)  {z =OrderCloseTime(); prof=OrderProfit();}
return(prof);}



//--------------------------------------------------------------------------------------//
//   lotshistory("",-1,-1); Функция возвращает лот последнего закрытого ордера
//   "" инструмент,( >-1 тип оордера, -1 все типы ),( -1 все меджики || >-1 по заданному меджику)
//--------------------------------------------------------------------------------------//
double lotshistory(string t,int x, int m)
{  string sym=""; int z=0 ; double lot=0;
   if ( t=="") sym=Symbol(); else sym = t ;
   int d=OrdersHistoryTotal(),i;for( i=0;i<=d;i++)               
   if ( OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == true )                       
   if ( OrderSymbol() == sym && (OrderMagicNumber() == m || m==-1 ) && OrderType()<=1)
   if ( x == -1 || OrderType() == x )
   if ( OrderCloseTime()>z)  {z  =OrderCloseTime(); lot=OrderLots();}
return(lot);}



//--------------------------------------------------------------------------------------//
//   orders ("",-1,-1); Функция возвращает колличество ордеров по выбранному символу
//   "" инструмент,( >-1 тип ордера, -1 все типы ),( -1 все меджики || >-1 по заданному меджику)
//--------------------------------------------------------------------------------------//
int orders (string t, int x , int m) 
{  string sym=""; int n=0 ;
   if ( t=="" ) sym=Symbol(); else sym = t ;
   for( int i=OrdersTotal()-1; i >= 0; i--   )               
   if ( OrderSelect(i,SELECT_BY_POS) == true )         
   if ( OrderSymbol() == sym && ( OrderMagicNumber() == m || m==-1 ) )
   if ( x == -1 || OrderType() == x ) n++ ;
return(n);}
//--------------------------------------------------------------------------------------//
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

09 Август 2013, 06:54:46
Ответ #1

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Функция устанавливает время удаления ордера , в случае когда это не возможно сама удаляет ордер через заданное время
//=======================================================================================================//

#property copyright "Trading-Go  Author Voldemar227, Skype Voldemar227, www.trading-go.ru"
#property link      "www.trading-go.ru"
extern int  LiveOrders = 60    ; // В секундах
extern bool AllSymbol  = false ; // True все символы
extern int  Magic      = -1    ; // -1 Все меджики

//=======================================================================================================//
int start()
  {
Mod ();
  }
//=======================================================================================================//
void Mod ()
  {
   for ( int i = OrdersTotal()-1; i >= 0; i--            )        // Перебор ордеров
      if ( OrderSelect(i,SELECT_BY_POS)==true              )      // Выбор ордера
         if ( OrderSymbol()==Symbol()    || AllSymbol == true)    // Определение Меджиков
            if ( OrderMagicNumber()==Magic || Magic     == -1  )  // Определение одного или всех символов
               if ( OrderType () > 1 && OrderExpiration() == 0 )  // Только отложенные ордера
                  if (OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),(OrderOpenTime()+LiveOrders),Green)==true) // Если удалось изменить ордер
                    Print("Modify Ok !!!"); // Вывести сообщение
                    else // Если модификация не удалась, пытаемся удалить
                    {    Print("Time to remove sek "+(OrderOpenTime()+LiveOrders-TimeCurrent()));// Выводим обратный отсчет жизни ордера
                           if (TimeCurrent()>(OrderOpenTime()+LiveOrders))          // Проверим текущее время и время открытия ордера с нашим интервалом , если больше
                              if ( OrderDelete(OrderTicket())==true)                // Удаляем ордер,
                                 Print("Delete order Ok !!!");                      // Если ордер удален успешно вывести сообщение
                                    else
                                       Print("Delete order Error "+GetLastError()); // Если ошибка , вывести номер ошибки
                     }
  }
//=======================================================================================================//
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

19 Ноябрь 2013, 18:49:22
Ответ #2

gazon_3

  • Постоялец

  • Оффлайн
  • ***

  • 180
  • Репутация:
    27
  • Пол
    Мужской

    Мужской
как сотворить виртуальный трейлинг-стоп отдельной функцией?   

19 Ноябрь 2013, 19:04:23
Ответ #3

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
как сотворить виртуальный трейлинг-стоп отдельной функцией?   
Нужно задать переменную , например VSL виртуальный стоп лос , затем сравнивать если ( цена - тралл ) выше этой переменной то ичменить значение переменной на VSL=  ( цена - тралл )
Нужно понимать что в случае перезагрузки терминала переменная потеряет свое значение ...
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

20 Ноябрь 2013, 12:57:04
Ответ #4

gazon_3

  • Постоялец

  • Оффлайн
  • ***

  • 180
  • Репутация:
    27
  • Пол
    Мужской

    Мужской
как найти закрытый ордер в истории за текущий день? хочу попробовать сделать так, что советник открывал один ордер на одном дневном баре на фунте-долларе, нашел закономерность, хочу реализовать.
 

23 Июнь 2014, 11:04:06
Ответ #5

KOT

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    1
  • Пол
    Мужской

    Мужской
Здравствуйте.Подскажите пожалуйста
увидел в видео NormalizeDouble(значение*_Point,_Digits);
НО при Print(_Digits); дает целоцисленное значение,а при  Print(MarketInfo("......",MODE_DIGITS));-дробное!?!?! И при нормализации выдет possible loss of data due to type conversion!

С MarketInfo(Symb,MODE_POINT) - вообще выдает USDCAD,H4: 1e-005.0
В чем проблема?


23 Июнь 2014, 12:43:49
Ответ #6

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Здравствуйте.Подскажите пожалуйста
увидел в видео NormalizeDouble(значение*_Point,_Digits);
НО при Print(_Digits); дает целоцисленное значение,а при  Print(MarketInfo("......",MODE_DIGITS));-дробное!?!?! И при нормализации выдет possible loss of data due to type conversion!

С MarketInfo(Symb,MODE_POINT) - вообще выдает USDCAD,H4: 1e-005.0
В чем проблема?



MarketInfo возвращает значение типа double параметр _Digits это целочисленный параметр, соотвественно при запросе на 5 знаке MarketInfo("......",MODE_DIGITS) мы получим 5.00000
Для компа 5 и 5.00000 разные числа поэтому одно из чисел нужно привести в порядок (int)MarketInfo("......",MODE_DIGITS) как сейчас видите так и пишите перед маркет инфо в скобках приведение типа инт.

Цитировать
С MarketInfo(Symb,MODE_POINT) - вообще выдает USDCAD,H4: 1e-005.0
Что бы привести значение в норму нужно преобразовать числа в текст, сейчас вы этого не делаете и машина выдает текст число по своему алгоритму по умолчанию
DoublTostr(MarketInfo(Symb,MODE_POINT))
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

23 Июнь 2014, 13:21:49
Ответ #7

KOT

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    1
  • Пол
    Мужской

    Мужской

23 Июнь 2014, 13:29:24
Ответ #8

KOT

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    1
  • Пол
    Мужской

    Мужской
Ага с дигитом получилось так:
int digitsCR1=(int)MarketInfo(Kross1,MODE_DIGITS);

23 Июнь 2014, 14:12:46
Ответ #9

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Ага с дигитом получилось так:
int digitsCR1=(int)MarketInfo(Kross1,MODE_DIGITS);
для вывода информации используйте правильный тип вы же выводите текст, сейчас в строке 99 и 100  вы число переводите в текст и засовываете в числовую переменную , тоесть снова делаете число
Print( DoublToStr (.....)  )
В функции Он Денит Вы удаляете граф обьекты
Кросс1 и Кросс2 но судя по коду это торговые пары и вы их никак удалить не сможете , так как функция ObjectDelete используется для удаление линий квадратов и текстов и ни как не может удальть торговый символ )))
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

23 Июнь 2014, 18:51:31
Ответ #10

KOT

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    1
  • Пол
    Мужской

    Мужской
Спасибо разобрался - запарка была в конечных рассчетах,выводимых на график -- не привел к стрингу.
Просто запринтовал поинт,а там иероглифы!
Я так понимаю mql при рассчете их понимает?
Но дигиты как Вы показали  нужно приводить к целочисленному знач.

Деиниты там по обьектам.

23 Июнь 2014, 19:01:51
Ответ #11

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Спасибо разобрался - запарка была в конечных рассчетах,выводимых на график -- не привел к стрингу.
Просто запринтовал поинт,а там иероглифы!
Я так понимаю mql при рассчете их понимает?
Но дигиты как Вы показали  нужно приводить к целочисленному знач.

Деиниты там по обьектам.
Да понимает , Вы тоже должны понимат приведение типов
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

23 Июнь 2014, 19:06:12
Ответ #12

KOT

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    1
  • Пол
    Мужской

    Мужской
Благодарю за помощь.
Простите только сейчас заметил что пишу не в ту ветку,прошу удалить,либо перенести мои посты.

09 Апрель 2016, 22:03:08
Ответ #13

Dream

  • Новичок

  • Оффлайн
  • *

  • 38
  • Репутация:
    2
  • Подпись под аватаром
    Каждый день по чуть, чуть...
Добрый день а есть функция перевода стоп лосса в безубыток? если есть дайте пожалуйста!!
Если ты опять ведомый - ушло твое время!

22 Апрель 2016, 08:04:05
Ответ #14

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Уважаемые друзья, мы переехали на новый более интересный и многофункциональный форум!
Теперь для пользователей появилось больше возможностей и удобств.
Если Ваша просьба не выполнена или вопрос остался без ответа, то это только потому что все усилия были направлены на настройку нового форума.
Пожалуйста, если Ваш вопрос, просьба актуальны, продублируйте его на новой форуме!
С удовольствием приглашаем Вас на новый более технологичный форум!

Перейти
Данный форум доступен только для чтения!
Регистрация, новые записи запрещены!
Все учетные данные перенесены на новый форум, повторная регистрация не требуется!
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...