Уроки по программированию на языке MQL4 от eevviill

Walt6730

Новичок форума
HELP!!! :please::please::please:Не могу заставить советник открывать сделки на ренко. На простых графиках открывает, переношу код открытия позы в скрипт - открывает. Какой код вписать в советник, что бы открывал сделки на ренко???

Присоединяюсь к запросу. Джентльмены программеры, не поможете особо одаренным?
 

gince

Местный знаток
Добрый вечер. Расписывать вступную речь не буду(она никому не нужна).

Скрипт.
PHP:
#property copyright "eevviill"
#property show_inputs

extern string Risk_by_trade_in_percents;
extern double Percent = 10;
extern bool buy = false;
extern bool sell = false;
 
extern int SL = 44;
extern int TP = 41; 
int sell_TP;
int buy_TP;
int sell_SL;
int buy_SL;
extern int Slippage = 4;
extern int Magic = 3414;
double Margin;
double Cost_of_1_lot;
double Lot_step;
double Lot_rounded;
double Max_lot;
double Min_lot;
int start()
  {
1)Margin = AccountFreeMargin();
2)Cost_of_1_lot = MarketInfo(Symbol(),MODE_MARGINREQUIRED);  
3)Lot_step = MarketInfo(Symbol(),MODE_LOTSTEP);
4)Lot_rounded = MathFloor(Margin*Percent/100/Cost_of_1_lot/Lot_step)*Lot_step ;
5)Min_lot = MarketInfo(Symbol(),MODE_MINLOT);
Max_lot = MarketInfo(Symbol(),MODE_MAXLOT);
6)if(Lot_rounded<Min_lot) Lot_rounded = Min_lot;
if(Lot_rounded>Max_lot) Lot_rounded = Max_lot;
7)double SLbuy=0, SLsell=0,TPbuy=0,TPsell=0; 
8)if(SL>0) {SLbuy=Ask-SL*Point; SLsell=Bid+SL*Point;}
if(TP>0) {TPbuy=Ask+TP*Point;TPsell=Bid-TP*Point;}
9)while(!IsTradeAllowed()) Sleep(1000);
10)if(buy) OrderSend(Symbol(),OP_BUY,Lot_rounded,Ask,Slippage,SLbuy,TPbuy,"Risk by trade",Magic,0,Blue);
while(!IsTradeAllowed()) Sleep(1000);
if(sell) OrderSend(Symbol(),OP_SELL,Lot_rounded,Bid,Slippage,SLsell,TPsell,"Risk by trade",Magic,0,Orange);
11)if(buy) Alert(Symbol(),"  Buy  ",Ask,"  ",Percent,"%  ",Lot_rounded);
if(sell) Alert(Symbol(),"  Sell  ",Bid,"  ",Percent,"%  ",Lot_rounded);
   return(0);
  }
Пояснение.
До функции Start() это всё объявление переменных. Это мы уже знаем.
1)Функция AccountFreeMargin() возвращает суму свободных средств на счете. Тоесть если в терминале у нас 400 доларов в средствах, то переменной Margin будет присвоено значение 400.00.
2)Функция MarketInfo(Symbol(),MODE_MARGINREQUIRED) узнаёт то условие торговли у нашего брокера что нам надо. Имеет 2 свойства.
2.1)MarketInfo(Symbol(),) название валютной пары. Если Symbol(), то значит проверка идёт по той валютной паре, к графику какой мы прикрипили скрипт.
2.2)MarketInfo(,MODE_MARGINREQUIRED) это то количество денег, что надо для покупки 1-го лота валютной пары.
3)MarketInfo(Symbol(),MODE_LOTSTEP) тоже что и в придыдущем примере, только MODE_LOTSTEP значит минимальный шаг на который мы можем увеличивать объём ордера.
4)Функция MathFloor округляет значения чегото то до 2 цифр после запятой. Это нам нужно, для того чтобы округлить наш 4-ох значный после запятой лот.
5)Функция MarketInfo(Symbol(),MODE_MINLOT). MODE_MINLOT это минимальный лот который разрешает брокер.
6)if(Lot_rounded<Min_lot) Lot_rounded = Min_lot; Здесь мы указали что если наш рисковый лот меньше минимальнодопустимого лота, то рисковый лот будет минимальнодопустимым.
7)double SLbuy=0, SLsell=0,TPbuy=0,TPsell=0; Здесь мы объявили переменные для ТП и СЛ. Они должны стоять со значениями 0.
8)if(SL>0) {SLbuy=Ask-SL*Point; SLsell=Bid+SL*Point;}
Здесь, мы указали что если СЛ больше 0, то(расчёт СЛ).
Квадратные скобки нужны если после if мы используем 2 и больше действия в случае if(истина).
Расчёт СЛ нужен потому что в ордере что мы открываем нужно указывать цену СЛ, а не на сколько пунктов она от цены открытия.
Point это то что переводит наш СЛ в цену.
9)Функция while(!IsTradeAllowed()) Sleep(1000);
while будет выполнять(зацикливание) то что у неё в скобках пока оно не станет ЛОЖЬ. (!IsTradeAllowed()) значит что скрипт не будет дальше выполнятся, пока не будет разрешена торговля(отключение терминала, торговля запрещена и т.д.) IsTradeAllowed значит что разрешена торговля, но у нас стоит знак ! значит не разрешена.
Sleep(1000) это количество милисекунд на выполнение цыкла.
10)if(buy) OrderSend(Symbol(),OP_BUY,Lot_rounded,Ask,Slippage,SLbuy,TPbuy,"Risk by trade",Magic,0,Blue);
Это уже окрытие ордера. Мы написали условие для его открытия, а именно если мы поставим buy=true(при прикреплении к графику).
OrederSend имеет 11 свойств.
10.1)Валютная пара.
10.2)бай, сел, бай стоп, сел стоп, бай лимит, сел лимит.
10.3)Лот.
10.4)Цена. Ask Bid.
10.5)Проскальзывание(в пунктах).
10.6)СЛ(в цене).
10.7)ТП(в цене).
10.8)Коментарий(будет виден в столбце Коментарии).
10.9)Магик намбер. Индивидуальный номер ордера.
10.10)Время истечения действия отложенного ордера.
10.11)Цвет стрелки на графике при открытии ордера.
11)if(buy) Alert(Symbol()," Buy ",Ask," ",Percent,"% ",Lot_rounded);
Это обычный алерт, но с условием и показан пример как делать растояние между значением переменных.
У вас в коде нету ни где примрненного Percent .
И еще такой вопрос. Как посчитать величину лота , если у меня стоп лос 200 пунктов (5 знаков) и я хочу рицковать только 2 процентамо от свободных средств. Т. е. , если закроеться по стопу, то я потеряю только 2 процента от свободных среств. Как токой подщет должен выглядеть ?
 
Последнее редактирование модератором:

eevviill

Заблокирован
...
И еще такой вопрос. Как посчитать величину лота , если у меня стоп лос 200 пунктов (5 знаков) и я хочу рицковать только 2 процентамо от свободных средств. Т. е. , если закроеться по стопу, то я потеряю только 2 процента от свободных среств. Как токой подщет должен выглядеть ?
Думаю типа так.
1) Узнаём сколько от дэпо(1000) эти 2%. 1000/100*2=20 дол.
2) Узнаём сколько доларов припадает на 1 тик. 20/200=0.1 дол.
3) MarketInfo(Symbol(),MODE_TICKVALUE)/10(у меня в терминале один тик считает 4 знак, хотя 5)*0.1=0.01(если еврдол)

P.S.
_http://mql4you.ru/tag/funkciya-rascheta-lota-mt4
 
Последнее редактирование:

uran2012

Новичок форума
Привет Всем! Подскажите как вписать работающий тейк профит !!!! не получается ничего!!!

PHP:
//+------------------------------------------------------------------+

extern string T = "Параметры торговли";
int ИНН=3333333;
extern double ЛотОткрытия = 0.02;     
int Повтор = 1;
extern int Лось = 100;
extern int Профит = 100;
extern int Пип = 50;
bool Принт=false;
extern string ММ = "Мани менеджмент";
extern bool    ИспользоватьММ  = false;
extern double  Риск               = 10;    
extern double  ИспользоватьПроцентБаланса = 100;   
extern double  Потери= 1000;  
extern double Экспонента =1.7;
double Покупка,Продажа,ПокупкаЛока,ПродажаЛока,открытие,ПрофитЗакрытия,Лосик,Проф,глав,сиг,глав1,сиг1;
string Коментарий, Команда="",тип,ком;
int билет,КоличествоОрдеров,операция,цвет,ордер;
extern string I = "Параметры Индюка";
extern int ПериодСигнала = 4;
extern int ПериодУсреднения = 2;
int Коэффициент1 = 1;
int Разрешение1 = 1;
int Разрешение2 = 1;
int СмещениеМакс = 999;
double Матрица1[];
double Матрица2[];
double Матрица3[];
double Матрица4[];
double Матрица5[];
double Матрица6[];
bool ВключитьСигнализацию = FALSE;
bool Email = FALSE;
bool ПодтверждениеПокупка = FALSE;
bool ПодтверждениеПродажа = FALSE;
datetime Время;
static int Смена=0,Сигнал;




int start() {
   
   double ИндюкВВ1[25000];
   double ИндюкВВ2[25000];
   double МатрицаСигналов2[25000];
   double МатрицаСигналов1[25000];
   double Максималка;
   double Закрывалка;
   for (int Смещение = СмещениеМакс; Смещение > 0; Смещение--) {
      Матрица1[Смещение] = 0;
      Матрица2[Смещение] = 0;
      Матрица3[Смещение] = 0;
      Матрица4[Смещение] = 0;
      Матрица5[Смещение] = 0;
      Матрица6[Смещение] = 0;
   }
   for (Смещение = СмещениеМакс - ПериодСигнала - 1; Смещение > 0; Смещение--) {
      ИндюкВВ1[Смещение] = iBands(NULL, 0, ПериодСигнала, ПериодУсреднения, 0, PRICE_CLOSE, MODE_UPPER, Смещение);
      ИндюкВВ2[Смещение] = iBands(NULL, 0, ПериодСигнала, ПериодУсреднения, 0, PRICE_CLOSE, MODE_LOWER, Смещение);
      if (Close[Смещение] > ИндюкВВ1[Смещение + 1]) Сигнал = 1;
      if (Close[Смещение] < ИндюкВВ2[Смещение + 1]) Сигнал = -1;
      if (Сигнал > 0 && ИндюкВВ2[Смещение] < ИндюкВВ2[Смещение + 1]) ИндюкВВ2[Смещение] = ИндюкВВ2[Смещение + 1];
      if (Сигнал < 0 && ИндюкВВ1[Смещение] > ИндюкВВ1[Смещение + 1]) ИндюкВВ1[Смещение] = ИндюкВВ1[Смещение + 1];
      МатрицаСигналов2[Смещение] = ИндюкВВ1[Смещение] + (Коэффициент1 - 1) / 2.0 * (ИндюкВВ1[Смещение] - ИндюкВВ2[Смещение]);
      МатрицаСигналов1[Смещение] = ИндюкВВ2[Смещение] - (Коэффициент1 - 1) / 2.0 * (ИндюкВВ1[Смещение] - ИндюкВВ2[Смещение]);
      if (Сигнал > 0 && МатрицаСигналов1[Смещение] < МатрицаСигналов1[Смещение + 1]) МатрицаСигналов1[Смещение] = МатрицаСигналов1[Смещение + 1];
      if (Сигнал < 0 && МатрицаСигналов2[Смещение] > МатрицаСигналов2[Смещение + 1]) МатрицаСигналов2[Смещение] = МатрицаСигналов2[Смещение + 1];
      if (Сигнал > 0) {
         if (Разрешение1 > 0 && Матрица1[Смещение + 1] == -1.0) {
            Матрица3[Смещение] = МатрицаСигналов1[Смещение];
            Матрица1[Смещение] = МатрицаСигналов1[Смещение];
            if (Разрешение2 > 0) Матрица5[Смещение] = МатрицаСигналов1[Смещение];
            if (ВключитьСигнализацию == TRUE && Смещение == 1 && !ПодтверждениеПокупка) {
               Максималка = Low[1];
               if (Low[2] < Максималка) Максималка = Low[2];
               if (Low[3] < Максималка) Максималка = Low[3];
               if (Low[4] < Максималка) Максималка = Low[4];
               Максималка -= Лось * Point;
               Закрывалка = Close[1];
               Сигнализация("Покупка", 0, Максималка, Закрывалка);
               ПодтверждениеПокупка = TRUE;
               ПодтверждениеПродажа = FALSE;
            }
         } else {
            Матрица1[Смещение] = МатрицаСигналов1[Смещение];
            if (Разрешение2 > 0) Матрица5[Смещение] = МатрицаСигналов1[Смещение];
            Матрица3[Смещение] = -1;
         }
         if (Разрешение1 == 2) Матрица1[Смещение] = 0;
         Матрица4[Смещение] = -1;
         Матрица2[Смещение] = -1.0;
         Матрица6[Смещение] = 0;
      }
      if (Сигнал < 0) {
         if (Разрешение1 > 0 && Матрица2[Смещение + 1] == -1.0) {
            Матрица4[Смещение] = МатрицаСигналов2[Смещение];
            Матрица2[Смещение] = МатрицаСигналов2[Смещение];
            if (Разрешение2 > 0) Матрица6[Смещение] = МатрицаСигналов2[Смещение];
            if (ВключитьСигнализацию == TRUE && Смещение == 1 && !ПодтверждениеПродажа) {
               Максималка = High[1];
               if (High[2] > Максималка) Максималка = High[2];
               if (High[3] > Максималка) Максималка = High[3];
               if (High[4] > Максималка) Максималка = High[4];
               Максималка += Лось * Point;
               Закрывалка = Close[1];
               Сигнализация("Продажа", 0, Максималка, Закрывалка);
               ПодтверждениеПродажа = TRUE;
               ПодтверждениеПокупка = FALSE;
            }
         } else {
            Матрица2[Смещение] = МатрицаСигналов2[Смещение];
            if (Разрешение2 > 0) Матрица6[Смещение] = МатрицаСигналов2[Смещение];
            Матрица4[Смещение] = -1;
         }
         if (Разрешение1 == 2) Матрица2[Смещение] = 0;
         Матрица3[Смещение] = -1;
         Матрица1[Смещение] = -1.0;
         Матрица5[Смещение] = 0;
      }
   }
   

 if (КоличествоОткрытых("+")<1&&Сигнал==1&&Смена!=Сигнал){if (КоличествоОткрытых("-")>0)Закрытие("-");Позиция("+");}
 if (КоличествоОткрытых("-")<1&&Сигнал==-1&&Смена!=Сигнал){if (КоличествоОткрытых("+")>0)Закрытие("+");Позиция("-");}

 Смена=Сигнал; 
   return (0);
}
//+------------------------------------------------------------------+
int КоличествоОткрытых(string тип)
{  int количество=0;
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)
   {  OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=ИНН) continue;
      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==ИНН)
      {  if (тип == "+")
         {if(OrderType()==OP_BUY) количество++;}
         if (тип == "-")
         {if(OrderType()==OP_SELL) количество++;}}}
   return(количество);}
//+------------------------------------------------------------------+
//+ MM
//+------------------------------------------------------------------+
double ММ()
{
   double лот;
   double МинимальныйЛот  = MarketInfo(Symbol(), MODE_MINLOT);
   double МаксимальныйЛот  = MarketInfo(Symbol(), MODE_MAXLOT);
   double ШагЛота = MarketInfo(Symbol(), MODE_LOTSTEP);
   лот  = (ИспользоватьПроцентБаланса / 100) * AccountBalance() * (Риск / 100) / Потери;
   лот = MathRound(лот / ШагЛота)  * ШагЛота;
   if(лот == 0) Print("Недостаточно ДЕПО для открытия минимального лота");
   else if(NormalizeDouble(лот-МинимальныйЛот,2) < 0) {Print("Взят минимальный лот"); лот = МинимальныйЛот;}
   else if(NormalizeDouble(лот-МаксимальныйЛот,2) > 0) {Print("Взят максимальный лот"); лот = МаксимальныйЛот;}
   return (лот);
}
//+------------------------------------------------------------------+
//|Размер нового лота                                      
//+------------------------------------------------------------------+
double НовыйЛот(string тип)
{  double Лот;
   double МинимальныйЛот = MarketInfo(Symbol(), MODE_MINLOT);
   double МаксимальныйЛот = MarketInfo(Symbol(), MODE_MAXLOT);
       if(тип=="+"&&ПоследнийЗакрОрдер("-","профит")>=0&&!ИспользоватьММ)Лот = ЛотОткрытия;else
       if(тип=="-"&&ПоследнийЗакрОрдер("+","профит")>=0&&!ИспользоватьММ)Лот = ЛотОткрытия;else
       
       if(тип=="+"&&ПоследнийЗакрОрдер("-","профит")>=0&&ИспользоватьММ)Лот = ММ();else
       if(тип=="-"&&ПоследнийЗакрОрдер("+","профит")>=0&&ИспользоватьММ)Лот = ММ();else
       
       if(тип=="+"&&ПоследнийЗакрОрдер("-","профит")<0)OrderSelect(ПоследнийЗакрытый("-"),SELECT_BY_TICKET);else
       if(тип=="-"&&ПоследнийЗакрОрдер("+","профит")<0)OrderSelect(ПоследнийЗакрытый("+"),SELECT_BY_TICKET);
        Лот=NormalizeDouble(OrderLots()*Экспонента,2);
   if(Лот < МинимальныйЛот) Лот = МинимальныйЛот; 
   if(Лот > МаксимальныйЛот) Лот = МаксимальныйЛот; 
   return(Лот);}

//+------------------------------------------------------------------+
//Возвращает цену или лот последнего ордера
//+------------------------------------------------------------------+
int ПоследнийЗакрытый(string тип)
{int t;
  if (тип=="+")t=OP_BUY;
  if (тип=="-")t=OP_SELL;
   int i, номер=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {  OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=ИНН&&OrderType()!=t) continue;
      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==ИНН&&OrderType()==t&&OrderCloseTime()>0)
         if(OrderTicket()>номер) номер=OrderTicket();}
return(номер);}
   
//+------------------------------------------------------------------+
//| открытие                               
//+------------------------------------------------------------------+
void Позиция(string инд)
{   double p,l;
  if (инд=="+"){операция=OP_BUY; открытие=Ask;Покупка = НовыйЛот(инд);цвет=Blue;тип="Бай";}
  if (инд=="-"){операция=OP_SELL; открытие=Bid;Покупка = НовыйЛот(инд);цвет=Red;тип="Селл";}
    {RefreshRates();
    билет=0;
      while(билет<1)
         { if(Принт) Print("Покупка "+тип+". Новый. Параметры. символ="+Symbol()+", лот="+DoubleToStr(Покупка,2)+", цена="+DoubleToStr(открытие,4)+" Профит="+DoubleToStr(p,4)+" Лось="+DoubleToStr(Лосик,4)+" маджик="+ИНН);
            билет = OrderSend(Symbol(),операция,Покупка,открытие,3,0,0,0,ИНН,0,цвет);
            if(билет<1) {if(Принт)Print("Ошибка: ",GetLastError()," Новая попытка покупки через "+(Повтор*60)+" секунд");Sleep(Повтор*60*1000);}}}
}
//+------------------------------------------------------------------+
//| Закрытие                                       
//+------------------------------------------------------------------+
void Закрытие(string тип)
  { int Тип;double цена;
          int Проскальзывание=3;
          if (тип=="-"){Тип=OP_SELL;цена=Ask;}
          if (тип=="+"){Тип=OP_BUY;цена=Bid;}
          for (int i=OrdersTotal()-1; i>=0; i--)
            {OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderType()!=Тип) break;
            if (OrderSymbol()==Symbol()&&OrderMagicNumber()==ИНН&&OrderType()==Тип)OrderClose(OrderTicket(),OrderLots(),цена,Проскальзывание,CLR_NONE);
            }}     

//+------------------------------------------------------------------+
//Сигнализатор
//+------------------------------------------------------------------+

void Сигнализация(string ТекстДействия, double ЦенаПрофита, double ЦенаЛося, double ЦенаОткрытия) {
   string НадписьЛось;
   string НадписьПрофит;
   string Надпись1;
   string Заголовок;
   string ТекстПисьма;
   if (Time[0] != Время) {
      Время = Time[0];
      if (ЦенаОткрытия != 0.0) Надпись1 = " at price " + DoubleToStr(ЦенаОткрытия, 4);
      else Надпись1 = "";
      if (ЦенаПрофита != 300) НадписьПрофит = ", TakeProfit on " + DoubleToStr(ЦенаПрофита, 4);
      else НадписьПрофит = "";
      if (ЦенаЛося != 0.0) НадписьЛось = ", StopLoss on " + DoubleToStr(ЦенаЛося, 4);
      else НадписьЛось = "";
      Alert("Дятел рекомендует " + ТекстДействия + Надпись1 + НадписьПрофит + НадписьЛось + " ", Symbol(), ", ", Period(), " минутный график");
      Заголовок = "Дятел рекомендует - " + ТекстДействия + Надпись1;
      ТекстПисьма = "Дятел рекомендует " + ТекстДействия + Надпись1 + НадписьПрофит + НадписьЛось + " " + Symbol() + ", " + Period() + " минутный график";
      if (Email) SendMail(Заголовок, ТекстПисьма);
   }
}   
//+------------------------------------------------------------------+
//Возвращает цену или лот последнего ордера
//+------------------------------------------------------------------+
double ПоследнийЗакрОрдер(string тип,string инф)
{  double профит;
   int i, номер=0;
      OrderSelect(ПоследнийЗакрытый(тип), SELECT_BY_TICKET);
                     профит=OrderProfit();
 if(инф=="профит")  return(профит);
}
 
Последнее редактирование модератором:

Platoon

Гуру форума
Привет Всем! Подскажите как вписать работающий тейк профит !!!! не получается ничего!!!

тейк профит (и стоп-лосс) указывается в функции OrderSend()
Если ваш ДЦ не позволяет сразу выставить тейк профит (и стоп-лосс) открываемого ордера, то нужно открыть ордер с нулевым ТП ( и нулевым СЛ), а затем немедленно его модифицировать, указав нужный ТП (и/или СЛ).
Пример (кусочек скрипта):
PHP:
...
   while(nn<3)     {
     ticket=OrderSend(Symbol(),OP_BUYSTOP,Lot,fractal,Slippage,0,0,NULL,MAGIC,0,CLR_NONE);
     if(ticket<=0)   {   int error=GetLastError();   Print("Error = ", error,"    ",ErrorDescription(error));  break;   }
     if(ticket>0)  {
       nn=4;
       if(OrderSelect(ticket, SELECT_BY_TICKET))  {
         modify=OrderModify(ticket, OrderOpenPrice(), 0, OrderOpenPrice()+Профит*Point,0,CLR_NONE);
         if(!modify)  {  error=GetLastError();   Print("Modify Error = ", error,"    ",ErrorDescription(error));  break;   }
       }
     }
...
 
Последнее редактирование модератором:

uran2012

Новичок форума
Возник новый вопрос: КАК заставить открывать ордер только один раз!!?
Пример:
Линия пересекает уровень 0, и открывается сделка. Сделка закрывается по тейкпрофиту , либо по стоплосс.

Какой нужен код, чтобы сделки не открывались до противоположного сигнала. (У меня они постоянно открываются после закрытия сделки в сторону сигнала)

PHP:
int start()
  {
  double tp,sl;
  if (Digits==2||Digits==4){tp=TekeProfit*Point; sl=StopLoss*Point;}
  if (Digits==3||Digits==5){tp=TekeProfit*10*Point;sl=StopLoss*10*Point;}
  double Line=iCustom(Symbol(),0,"NameIndicator",period,1,1);
//----
    if (OrdersTotal()==0&&Volume[0]==1)
    {
    if (Line>Level) OrderSend(Symbol(),OP_BUY,Lot,Ask,100,Ask-sl,Ask+tp,NULL,Magic,0,CLR_NONE);
    }
//----
   return(0);
  }

Ps. Начинающий сильно не пинать)
 
Последнее редактирование:

eevviill

Заблокирован
Возник новый вопрос: КАК заставить открывать ордер только один раз!!?
Пример:
Линия пересекает уровень 0, и открывается сделка. Сделка закрывается по тейкпрофиту , либо по стоплосс.

Какой нужен код, чтобы сделки не открывались до противоположного сигнала. (У меня они постоянно открываются после закрытия сделки в сторону сигнала)

PHP:
int start()
  {
  double tp,sl;
  if (Digits==2||Digits==4){tp=TekeProfit*Point; sl=StopLoss*Point;}
  if (Digits==3||Digits==5){tp=TekeProfit*10*Point;sl=StopLoss*10*Point;}
  double Line=iCustom(Symbol(),0,"NameIndicator",period,1,1);
//----
    if (OrdersTotal()==0&&Volume[0]==1)
    {
    if (Line>Level) OrderSend(Symbol(),OP_BUY,Lot,Ask,100,Ask-sl,Ask+tp,NULL,Magic,0,CLR_NONE);
    }
//----
   return(0);
  }

Ps. Начинающий сильно не пинать)
Там же есть функция подсчета ордеров.
 

Dobryj

Почетный гражданин
Добрый Вечер всем !
помогите разрешить проблему ,пишу скрипт идея такая при установке на график рисуются 2 объекта трендова и вертикальная линия , при растяжении трендовой линии
вертикальная тоже движется по формуле !
есть понимание что при изминении длины трендовой должна быть проверка данных для вертикальной линии если есть изменения ее нужно удалить и нарисовать новую по новым значениям , только вот не получается ...
Помогите мне =)
вот код...
//+------------------------------------------------------------------+
//| 11111111111111111111111111111.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| _http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
// INPUT parameters
int t0,tp,i0,ip;
double V,kt,per;
double pr0,prp,Hight,low;
datetime xxx;
//------------------------------------
int init()
{
per=Period();
kt=60/per;
t0=TimeOnDropped();

i0=iBarShift(Symbol(),Period(),t0); // считываем
pr0=Close[i0];
ip=i0+40;
tp=Time[ip];
prp=Close[ip];


ObjectCreate("LineV",2,0,tp,prp,t0,pr0); //Рисуем трендовую линию
ObjectSet ("LineV",OBJPROP_COLOR,Blue);
ObjectSet ("LineV", OBJPROP_RAY,False);


ObjectCreate( "LineW",OBJ_VLINE,0,xxx,0); //Рисуем Вертикальную линию
ObjectSetText("LineW","text", 20, "Arial",Blue );
ObjectSet("LineW",OBJPROP_COLOR,Blue);
ObjectSet("LineW",OBJPROP_STYLE,STYLE_DASH);


return(0);
}

//---------------------------------------------------------


int start()
{

while(IsStopped()==false)
{
tp=ObjectGet("LineV",OBJPROP_TIME1);
t0=ObjectGet("LineV",OBJPROP_TIME2);



ip=iBarShift(Symbol(),Period(),tp);
i0=iBarShift(Symbol(),Period(),t0);

if (t0>Time[0]) i0=(Time[0]-t0)/60/per;


xxx=((ip-i0)*86400)+ t0;

Comment(xxx);
}





return(0);
}
//+------------------------------------------------------------------+
 
Последнее редактирование модератором:

_SERG_

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

ObjectCreate("LineV",2,0,tp,prp,t0,pr0); //Рисуем трендовую линию
ObjectSet ("LineV",OBJPROP_COLOR,Blue);
ObjectSet ("LineV", OBJPROP_RAY,False);


ObjectCreate( "LineW",OBJ_VLINE,0,xxx,0); //Рисуем Вертикальную линию
ObjectSetText("LineW","text", 20, "Arial",Blue );
ObjectSet("LineW",OBJPROP_COLOR,Blue);
ObjectSet("LineW",OBJPROP_STYLE,STYLE_DASH);

Перенести в Start(), а то как отрисовываться будет?
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Добрый Вечер всем !
помогите разрешить проблему ,пишу скрипт идея такая при установке на график рисуются 2 объекта трендова и вертикальная линия , при растяжении трендовой линии
вертикальная тоже движется по формуле !
есть понимание что при изминении длины трендовой должна быть проверка данных для вертикальной линии если есть изменения ее нужно удалить и нарисовать новую по новым значениям , только вот не получается ...
Помогите мне =)
вот код...
//+------------------------------------------------------------------+
//| 11111111111111111111111111111.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| _http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
// INPUT parameters
int t0,tp,i0,ip;
double V,kt,per;
double pr0,prp,Hight,low;
datetime xxx;
//------------------------------------
int init()
{
per=Period();
kt=60/per;
t0=TimeOnDropped();

i0=iBarShift(Symbol(),Period(),t0); // считываем
pr0=Close[i0];
ip=i0+40;
tp=Time[ip];
prp=Close[ip];


ObjectCreate("LineV",2,0,tp,prp,t0,pr0); //Рисуем трендовую линию
ObjectSet ("LineV",OBJPROP_COLOR,Blue);
ObjectSet ("LineV", OBJPROP_RAY,False);


ObjectCreate( "LineW",OBJ_VLINE,0,xxx,0); //Рисуем Вертикальную линию
ObjectSetText("LineW","text", 20, "Arial",Blue );
ObjectSet("LineW",OBJPROP_COLOR,Blue);
ObjectSet("LineW",OBJPROP_STYLE,STYLE_DASH);


return(0);
}

//---------------------------------------------------------


int start()
{

while(IsStopped()==false)
{
tp=ObjectGet("LineV",OBJPROP_TIME1);
t0=ObjectGet("LineV",OBJPROP_TIME2);



ip=iBarShift(Symbol(),Period(),tp);
i0=iBarShift(Symbol(),Period(),t0);

if (t0>Time[0]) i0=(Time[0]-t0)/60/per;


xxx=((ip-i0)*86400)+ t0;

Comment(xxx);
}





return(0);
}
//+------------------------------------------------------------------+
Ничего удалять не надо. Надо просто используя ObjectSet() назначить новые параметры.
 

Dobryj

Почетный гражданин
Ничего удалять не надо. Надо просто используя ObjectSet() назначить новые параметры.

Спасибо помогло !:)
появилась новая проблемка

int a=50;
//t0-это координата трендовой линии от которой нужно отложить (a)


time=t0+a*86400;


ObjectCreate( "LineW",OBJ_VLINE,0,time,0);
ObjectSetText("LineW","text", 20, "Arial",Blue );
ObjectSet("LineW",OBJPROP_COLOR,Blue);
ObjectSet("LineW",OBJPROP_STYLE,STYLE_DASH);
ObjectSet("LineW",OBJPROP_TIME1,time);
Вертикальная линия движется но отмеряет не 50 баров а с погрешностью всегда 4-8 баров , с чем это связано ?и как исправить ?
 

eevviill

Заблокирован
Спасибо помогло !:)
появилась новая проблемка

int a=50;
//t0-это координата трендовой линии от которой нужно отложить (a)


time=t0+a*86400;


ObjectCreate( "LineW",OBJ_VLINE,0,time,0);
ObjectSetText("LineW","text", 20, "Arial",Blue );
ObjectSet("LineW",OBJPROP_COLOR,Blue);
ObjectSet("LineW",OBJPROP_STYLE,STYLE_DASH);
ObjectSet("LineW",OBJPROP_TIME1,time);
Вертикальная линия движется но отмеряет не 50 баров а с погрешностью всегда 4-8 баров , с чем это связано ?и как исправить ?
Проблему сходу не решу(да и ветка не та), но
1) Узнать сколько занимает один бар
PHP:
int one_bar_time=Time[1]-Time[2];
2) Создавать объект надо полсе проверки есть ли он уже.
PHP:
if(ObjectFind("LineW")==-1)
ObjectCreate( "LineW",OBJ_VLINE,0,time,0);
3) Если дальше идёт установка координат, то объект можно(нужно?) создавать с нулевыми параметрами.
PHP:
ObjectCreate( "LineW",OBJ_VLINE,0,0,0);
 

AlexeyVik

Программист mql4 mql5
Спасибо помогло !:)
появилась новая проблемка

int a=50;
//t0-это координата трендовой линии от которой нужно отложить (a)


//time=t0+a*86400; Это должно быть так
time = Time[t0+50]; // Или Time[t0+a];

ObjectCreate( "LineW",OBJ_VLINE,0,time,0);
ObjectSetText("LineW","text", 20, "Arial",Blue );
ObjectSet("LineW",OBJPROP_COLOR,Blue);
ObjectSet("LineW",OBJPROP_STYLE,STYLE_DASH);
ObjectSet("LineW",OBJPROP_TIME1,time);
Вертикальная линия движется но отмеряет не 50 баров а с погрешностью всегда 4-8 баров , с чем это связано ?и как исправить ?
Подсказка в коде. Если не попал, значит пробуй не 50, а 49
Или-же если считаешь по ТФ не соответствующему открытому графику, то надо использовать iBarShift()
И перед созданием объекта поставь проверку на его наличие как подсказал Василий. Не обязательно, но так будет грамотней. А создавать объект с нулевыми параметрами не обязательно, но не критично, если дальше в коде есть ObjectSet() с нужными параметрами.
 

Dobryj

Почетный гражданин
Проблему сходу не решу(да и ветка не та), но
1) Узнать сколько занимает один бар
PHP:
int one_bar_time=Time[1]-Time[2];
2) Создавать объект надо полсе проверки есть ли он уже.
PHP:
if(ObjectFind("LineW")==-1)
ObjectCreate( "LineW",OBJ_VLINE,0,time,0);
3) Если дальше идёт установка координат, то объект можно(нужно?) создавать с нулевыми параметрами.
PHP:
ObjectCreate( "LineW",OBJ_VLINE,0,0,0);

Сделал как сказали но проблема не ушла :disappointed:
всегда есть погрешность 1-2 бара !скрипт тестирую на дневном тайме
я уже думаю что это как то выходные всю картинку портят ...
может есть еще мысли как данный баг исправить :facepalm:
вот код
//+------------------------------------------------------------------+
//| Time_Go! .mq4 |
//| |
//| Dobryjj |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""




/*=====INPUT parameters=====*/
extern int A=50; //откладываемое расстояние
double pr0,prp,Hight,low;
double V,kt,per;
int i0,ip;
datetime tp,t0,time;


/*==========================*/

int init()
{

per=Period();
kt=60/per;
t0=WindowTimeOnDropped();

i0=iBarShift(Symbol(),Period(),t0); // считываем
pr0=Close[i0];
ip=i0+40;
tp=Time[ip];
prp=Close[ip];

if(ObjectFind("LineV")==-1)
{
ObjectCreate("LineV",2,0,tp,prp,t0,pr0); //Рисуем трендовую линию
ObjectSet ("LineV",OBJPROP_COLOR,Blue);
ObjectSet ("LineV", OBJPROP_RAY,False);
}

if(ObjectFind("LineW")==-1)
{
ObjectCreate( "LineW",OBJ_VLINE,0,0,0); //Рисуем Вертикальную линию
ObjectSetText("LineW","text", 20, "Arial",Blue );
ObjectSet("LineW",OBJPROP_COLOR,Blue);
ObjectSet("LineW",OBJPROP_STYLE,STYLE_DASH);
}

return(0);
}


/*==========================================================*/


int start()
{

Comment(A);

while(IsStopped()==false)
{

tp=ObjectGet("LineV",OBJPROP_TIME1);
t0=ObjectGet("LineV",OBJPROP_TIME2);
prp=ObjectGet("LineV",OBJPROP_PRICE1);
pr0=ObjectGet("LineV",OBJPROP_PRICE2);
ip=iBarShift(Symbol(),Period(),tp);
i0=iBarShift(Symbol(),Period(),t0);

if (t0>Time[0]) i0=(Time[0]-t0)/60/per;

/*------------------------------------------*/
time=t0+(A*86400);
ObjectSet("LineW",OBJPROP_TIME1,time);
/*------------------------------------------*/

}
return(0);
}
/*==========================================================*/

int deinit()
{
ObjectDelete("LineV");
ObjectDelete("LineW");
}
 

Вложения

  • Time_Go! .mq4
    2,2 КБ · Просмотры: 28

eevviill

Заблокирован
Сделал как сказали но проблема не ушла :disappointed:
всегда есть погрешность 1-2 бара !скрипт тестирую на дневном тайме
я уже думаю что это как то выходные всю картинку портят ...
может есть еще мысли как данный баг исправить :facepalm:
вот код
...
Ты лучше фото сделай что ты хочешь.
 

qqmber

Почетный гражданин
Сделал как сказали но проблема не ушла :disappointed:
всегда есть погрешность 1-2 бара !скрипт тестирую на дневном тайме
я уже думаю что это как то выходные всю картинку портят ...
может есть еще мысли как данный баг исправить :facepalm:
Правильно думаешь. Ты хочешь смещение на 50 баров, а вычисляешь смещение на 50 суток. Бар не каждые сутки бывает.
Рисуй палку на Time[i0-A], будет как надо.
 

AlexeyVik

Программист mql4 mql5
Правильно думаешь. Ты хочешь смещение на 50 баров, а вычисляешь смещение на 50 суток. Бар не каждые сутки бывает.
Рисуй палку на Time[i0-A], будет как надо.
Так я ему об этом и говорил чуть выше.
Только зря наверное оставил это в его тексте под спойлером, как было у него. Может не видел.
 
Верх