• Уважаемый гость! Чтобы просмотреть скрытую часть информации Вам нужно зарегистрироваться.

    Быстрая регистрация!

Удалено Простые функции для конструирования советников ...

  • Автор темы Admin
  • Дата начала
  • Автор темы
  • Панель управления
  • #1
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 224
Реакции
517
В данной теме рассмотрим и поможем в составлении кода из простых функций


//--------------------------------------------------------------------------------------//
// 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);}
//--------------------------------------------------------------------------------------//
 
  • Автор темы
  • Панель управления
  • #2
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 224
Реакции
517
Функция устанавливает время удаления ордера , в случае когда это не возможно сама удаляет ордер через заданное время
Код:
//=======================================================================================================//

#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()); // Если ошибка , вывести номер ошибки 
                     } 
  }
//=======================================================================================================//
 
G

gazon_3

Участник
Регистрация
29.07.2013
Сообщения
180
Реакции
0
как сотворить виртуальный трейлинг-стоп отдельной функцией?
 
  • Автор темы
  • Панель управления
  • #4
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 224
Реакции
517
как сотворить виртуальный трейлинг-стоп отдельной функцией?
Нужно задать переменную , например VSL виртуальный стоп лос , затем сравнивать если ( цена - тралл ) выше этой переменной то ичменить значение переменной на VSL= ( цена - тралл )
Нужно понимать что в случае перезагрузки терминала переменная потеряет свое значение ...
 
G

gazon_3

Участник
Регистрация
29.07.2013
Сообщения
180
Реакции
0
как найти закрытый ордер в истории за текущий день? хочу попробовать сделать так, что советник открывал один ордер на одном дневном баре на фунте-долларе, нашел закономерность, хочу реализовать.
 
K

KOT

Участник
Регистрация
20.06.2014
Сообщения
11
Реакции
0
Здравствуйте.Подскажите пожалуйста
увидел в видео 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
В чем проблема?
 
  • Автор темы
  • Панель управления
  • #7
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 224
Реакции
517
Здравствуйте.Подскажите пожалуйста
увидел в видео 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))
 
K

KOT

Участник
Регистрация
20.06.2014
Сообщения
11
Реакции
0
Не выходит...
https://yadi.sk/i/MtPSFBSXUWfNR
 
K

KOT

Участник
Регистрация
20.06.2014
Сообщения
11
Реакции
0
Ага с дигитом получилось так:
int digitsCR1=(int)MarketInfo(Kross1,MODE_DIGITS);
 
  • Автор темы
  • Панель управления
  • #10
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 224
Реакции
517
Ага с дигитом получилось так:
int digitsCR1=(int)MarketInfo(Kross1,MODE_DIGITS);
для вывода информации используйте правильный тип вы же выводите текст, сейчас в строке 99 и 100 вы число переводите в текст и засовываете в числовую переменную , тоесть снова делаете число
Print( DoublToStr (.....) )
В функции Он Денит Вы удаляете граф обьекты
Кросс1 и Кросс2 но судя по коду это торговые пары и вы их никак удалить не сможете , так как функция ObjectDelete используется для удаление линий квадратов и текстов и ни как не может удальть торговый символ )))
 
K

KOT

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

Деиниты там по обьектам.
 
  • Автор темы
  • Панель управления
  • #12
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 224
Реакции
517
Спасибо разобрался - запарка была в конечных рассчетах,выводимых на график -- не привел к стрингу.
Просто запринтовал поинт,а там иероглифы!
Я так понимаю mql при рассчете их понимает?
Но дигиты как Вы показали нужно приводить к целочисленному знач.

Деиниты там по обьектам.
Да понимает , Вы тоже должны понимат приведение типов
 
Теги Нет
Верх