# Ваши вопросы по языку MQL4

Раздел: Язык программирования MQL4
Автор темы: chocolate
Создана: 2011-11-07 10:37
Ответов: 9576 | Просмотров: 1111192
Страница 1 из 479
Источник: https://forexsystemru.com/threads/65289/

---

## chocolate — 2011-11-07 10:37

Данная тема создана для любых вопросов относительно языка программирования MQL4. Спрашиваем, отвечаем, помогаем и живем дружно.

Всем успехов.

Аналогичная тема, но для MQL5 http://forexsystemsru.com/yazyk-programmirovaniya-mql-5/65448-voprosy-po-mql5.html#post339519

## Arnold100 — 2011-11-08 15:49

Помогите разобраться! Хочу написать индикатор (скрипт). Принцип работы такой: я строю произвольную трендовую линию от A до B, а индикатор рассчитывает сколько цена прошла в пунктах по ценовой шкале, т.е. В-А. А также сколько цена прошла по времени в барах от А до В! Может кто-нибудь подскажет с чего начать???

## andrspir — 2011-11-10 12:50

**Прошу помочь примером**

Есть отличная система (не мартин) при ручной торговле результат просто волшебный. Пытаюсь ее автоматизировать, но слабоват в языке.
 
Основа у меня готова, прошу помочь примером...
Есть переменная Lot=0.01
Как программно если предыдущая сделка закрылась по стоп-лосу выполнить Lot=Lot+0.01 ?
 
Советник работает потиково и уменя билеберда.

## Lender — 2011-11-11 01:12

строиш свою трендовую на графике руками, 
в скрипте\индюке\сове узнаеш нужные тебе параметры своей линии
спомощью 
ObjectGet( string name, int prop_id) 
name - имя твоего обекта
prop_id   -   Идентификатор свойства объекта. Может быть любым из значений списка свойств объекта. 

Пример вызова:
 double price1 = ObjectGet("hline12", OBJPROP_PRICE1);

в хелпе все достаточно понятно описано

## Lender — 2011-11-11 01:24

double Lots = 0.01;
   int    orders=HistoryTotal();     // history orders total
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderClosePrice() == OrderStopLoss()) { Lots += 0.01 ; }
        }
     }
     
Лови, только я не проверял на работоспособность, просто выдернул с стандартного сова МувингАвераге кусок кода и изменил всего две строки...

## andrspir — 2011-11-11 09:50

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

## fairslog — 2011-11-13 17:28

Добрый день, в прграмировании новичёк, охота разобраться но времени не хватает, есть советник, хочу в него добавить трал, может ктонибудь объяснить как это правильно вписать, сам советник - декомпил.
Буду очень признателен, ещё , торговля в советнике пачкой ордеров.

## Lender — 2011-11-15 17:47

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

если же не жалко 5-13 можно обратится к платному программисту в разделе работа, или за бесплатно с форума какого то прогера подправить попроси...

## fairslog — 2011-11-15 17:56

Спасибо за рекомендации,  не святые горшки лепят, так и тут, просто интересно разобраться  как правильно это сделать,  когдато все програмисты с чего то начинали и то-же также спрашивали, мне вузы  поздно оканчивать, а вот понять чтоб для себя это делать хотя бы интересно.....
Так что вопрос остаётся актуальным.

## 271863768 — 2011-11-16 15:00

Помогите пожалуйста прикрутить мартышку и трал к этому советнику, торгую на 5 минутках и моя стратегия требует быстрой установки ордеров, в случае СЛ удвоения и трала...очень надо :) спасибо заранее

## Lender — 2011-11-17 01:37

> Цитата (fairslog):
> Спасибо за рекомендации,  не святые горшки лепят, так и тут, просто интересно разобраться  как правильно это сделать,  когдато все програмисты с чего то начинали и то-же также спрашивали, мне вузы  поздно оканчивать, а вот понять чтоб для себя это делать хотя бы интересно.....
> Так что вопрос остаётся актуальным.

если хочешь изучить мкл, то начинай с азов: типы переменных(представление данных), условные операторы, циклы, функции без параметров и с ими, если это знать то мкл4 с его хелпом со стандартным функциями дальше изучить труда не составит, так как хелп там ну оочень тяжело не понять

для объектного-ориентированного языка лесенка возможно будет чуток иначе

> Цитата (271863768):
> Помогите пожалуйста прикрутить мартышку и трал к этому советнику, торгую на 5 минутках и моя стратегия требует быстрой установки ордеров, в случае СЛ удвоения и трала...очень надо :) спасибо заранее

в разделе "работа" на этом форуме тебе охотно помогут, там и моя ветка есть

## 271863768 — 2011-11-17 15:34

Подскажите пожалуйста как реализовать отложенный ордер на расстоянии от МА для 5 знака

OrderSend(Symbol(),OP_BUYSTOP,0.1,ma+Dist_,NULL,NULL,Blue);
постоянно выскакивает ошибка 4107 хотя через Алерт показывает нужную цену на которую я бы хотел поставить отложку :(

## Lender — 2011-11-18 02:32

> Цитата (271863768):
> Подскажите пожалуйста как реализовать отложенный ордер на расстоянии от МА для 5 знака
>
> OrderSend(Symbol(),OP_BUYSTOP,0.1,ma+Dist_,NULL,NULL,Blue);
> постоянно выскакивает ошибка 4107 хотя через Алерт показывает нужную цену на которую я бы хотел поставить отложку :(

ERR_INVALID_PRICE_PARAM 4107 Неправильный параметр цены для торговой функции 
гугл и хелп в помощь

перед тем как подавать цену в OrderSend ее нужно нормализировать(привести к нужному кол-ву знаков за запетой)
price = NormalizeDouble( ma+Dist_ , Digits);
OrderSend(Symbol(),OP_BUYSTOP,0.1, price,NULL,NULL,Blue);

а в алерте все виглядело хорошо скорее всего из-за того что в параметер цену ты передавал как double а не string

в хелпе все написано

void Alert( ...) 
Отображает диалоговое окно, содержащие пользовательские данные. Параметры могут быть любого типа. Количество параметров не может превышать 64.

Массивы нельзя передавать в функцию Alert(). Массивы должны выводиться поэлементно.

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().
Данные типы bool, datetime и color будут выведены как числа.
Чтобы вывести данные типа datetime в виде строки, необходимо использовать функцию TimeToStr().

## 271863768 — 2011-11-22 13:19

Прошу меня извинить :-[ ну никак не могу понять как реализовать функцию подсчета прибыли или убытка закрытого ордера или суммы ордеров :)

## Lender — 2011-11-22 18:30

> Цитата (271863768):
> Прошу меня извинить :-[ ну никак не могу понять как реализовать функцию подсчета прибыли или убытка закрытого ордера или суммы ордеров :)

схожий выше есть примемр:

     double Lots = 0.01;
   int    orders=HistoryTotal();     // history orders total
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderClosePrice() == OrderStopLoss()) { Lots += 0.01 ; }
        }
     }  

чуточку его переделываем, и получаем профит последнего закрытого ордера:

     double profit = 0;
     bool flag set_trofit = false;
   int    orders=HistoryTotal();     // history orders total
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
           if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;       
           {profit = OrderProfit(); set_trofit = true; break;}
        }
     }  

пслалось прям тут, на правильность не проверял, что нужно еще сам допишешь

## max020780 — 2011-11-22 23:39

помогите пожалуйста разобраться как сделать так чтобы в этом коде
int start()
{

int P1= Period1 ;
int P2= Period2 ;
int P3= Period3 ;

   double L_4=iCustom(NULL,PERIOD_H1,"volna",P1,P2,P3,4,0);
   double L_5=iCustom(NULL,PERIOD_H1,"volna",P1,P2,P3,5,0);  
   
                     
      
    if (L_4<L_5 ) {
   
   Comment("Работаем на SELL");
  
   и открывался ордер на SELL каждом новом баре
  }
   
   if (L_4>L_5 ){
    Comment("Работаем на BUY");
    
А при выполнении этого условия открывался ордер на BUY тоже на каждом новом баре
     }
     
     }
     
            
 А то у меня получается только либо открывается только один ордер как только условие выполнилось либо вообще на каждом тике открывает

## Влад Рус — 2011-12-02 14:38

**Работа с массивами**

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

   double arr_Orders;
	int Qnt=0;                    // объявление и обнуление счётчика ордеров
   ArrayInitialize (arr_Orders,0);    // обнуление массива
   for(int i=0; i<OrdersTotal();i++)  // ищем ордера и заполняем массив
   {
   if((OrderSelect(i,SELECT_BY_POS)==true)
   && (OrderSymbol()==Symbol()))
   {  Qnt++;
      arr_Orders=OrderOpenPrice();
      arr_Orders=OrderStopLoss();
      arr_Orders=OrderTakeProfit();
      arr_Orders=OrderTicket();
      arr_Orders=OrderLots();
      arr_Orders=OrderType();
      arr_Orders=OrderMagicNumber();
      arr_Orders=OrderProfit();
      arr_Orders=OrderOpenTime();
   } }  arr_Orders=Qnt;

Задача 1: Выдернуть из его два ордера с одинаковым OrderOpenTime(), чтобы один из них убыточный закрыть по тикеру - нужен тикер.
Задача 2: Достать из его ордер с наименьшим OrderProfit() (среди всех ордеров в массиве), чтобы с ним тоже чё-нить сделать тоже по тикеру. Нутром чую - нужен перебор и функция MathMin, а с какой стороны подступиться не пойму... Уже неделю сижу - мозги набекрень. Буду рад получить форУмный совет. ВСЕМ Спасибо.

## andrspir — 2011-12-03 01:49

**Как скачать текстовый файл?**

Помогите, как в советнике реализовать скачивание текстового файла по адресу в интернете?

## Lender — 2011-12-03 18:59

> Цитата (Влад Рус):
> Задача 1: Выдернуть из его два ордера с одинаковым OrderOpenTime(), чтобы один из них убыточный закрыть по тикеру - нужен тикер.

написал как есть, ничего не проверял

 int ord1, ord2;
 bool find = false;
   
 for( i = 1 ; i <= arr_Orders ; i++ ) // нумерация идет с 1 так как в строе 0 хранится кол-во ордеров в масиве
 {
   ord1 = i; // записали строку с ордером для сравнения с остальными ордерами
     
     for( int j = i ; j <= arr_Orders ; j++ ) // цикл перебора остальных ордеров
     {
        if( arr_Orders >= arr_Orders-20 && arr_Orders <= arr_Orders+20 )
        {            // если время открытия ордеров отличаются друг от друга на +-20 секунд 
          ord2 = j;
          find = true;
          break; // перерываем выполнения цикла(выходим из его так как уже нашли что искали)
        }
     }
 }
 
 if( find )
 {
   if( OrderSelect( arr_Orders, SELECT_BY_TICKET ) )
     if( OrderProfit() < 0.0 )
     {
       OrderClose(...);
     }
     else if( OrderSelect( arr_Orders, SELECT_BY_TICKET ) )
     if( OrderProfit() < 0.0 )
       OrderClose(...);     
 }

Вторая задачка

 int ticket = EMPTY;
 int profit;
    
 for( i = 1 ; i <= arr_Orders ; i++ ) // нумерация идет с 1 так как в строе 0 хранится кол-во ордеров в масиве
 {
   if( OrderSelect(arr_Orders, SELECT_BY_TICKET) )
   { 
     if( ticket == EMPTY )
     {
       profit = OrderProfit()+OrderSwap()+OrderCommission();
       ticket = arr_Orders;
     }  
     else
     {
       if( OrderProfit()+OrderSwap()+OrderCommission() < profit )
       {
         profit = OrderProfit()+OrderSwap()+OrderCommission();
         ticket = arr_Orders;
       }
     }
   }
 }

тоже не тестил,  в переменной ticket будет хранится тикет ордера с наименьшим профитом или EMPTY если никаких оржеров не нашло

А вообще двумерные массивы очень редко используются на практике, сколько не писал(на мкл) мне вообще не приходилось ими пользоваться...

как по мне за использование двумерных массивов как в примере нужно по руках бить...

## Walt6730 — 2011-12-05 07:33

**Помощь тупому :)**

Господа,

Очень нужна помощь. Имеется индикатор, очень простой и всем, наверное, известный: Trend Magic. Основан на двух стандартных индикаторах: CCI(50) и ATR(5). Рисует очень красивые линии на графике. У меня, как чайника в программировании, имеется вопрос: как из значений CCI и ATR получается значение, которое отображается на графике цены и по которому рисуется эта самая линия? Можете вывести формулу?

---

Следующая страница: https://forexsystemru.com/threads/65289/page-2
