Ответить
21.10.2013, 06:37
Аватар для Walt6730
Walt6730 Walt6730 вне форума Активный участник
Регистрация: 19.05.2009 / Сообщений: 36
Поблагодарили 2 раз(а) / Репутация: 2
HELP!!! Не могу заставить советник открывать сделки на ренко. На простых графиках открывает, переношу код открытия позы в скрипт - открывает. Какой код вписать в советник, что бы открывал сделки на ренко???
Присоединяюсь к запросу. Джентльмены программеры, не поможете особо одаренным?
30.10.2013, 11:16
Аватар для gince
gince gince на форуме Местный знаток
Регистрация: 09.09.2008 / Адрес: Литва / Сообщений: 449
Поблагодарили 812 раз(а) / Репутация: 812
  • Отправить сообщение для gince с помощью Skype™
Добрый вечер. Расписывать вступную речь не буду(она никому не нужна).

Скрипт.

Скрытый текст

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_lotLot_rounded Min_lot;
if(
Lot_rounded>Max_lotLot_rounded Max_lot;
7)double SLbuy=0SLsell=0,TPbuy=0,TPsell=0
8)if(SL>0) {SLbuy=Ask-SL*PointSLsell=Bid+SL*Point;}
if(
TP>0) {TPbuy=Ask+TP*Point;TPsell=Bid-TP*Point;}
9)while(!IsTradeAllowed()) Sleep(1000);
10)if(buyOrderSend(Symbol(),OP_BUY,Lot_rounded,Ask,Slippage,SLbuy,TPbuy,"Risk by trade",Magic,0,Blue);
while(!
IsTradeAllowed()) Sleep(1000);
if(
sellOrderSend(Symbol(),OP_SELL,Lot_rounded,Bid,Slippage,SLsell,TPsell,"Risk by trade",Magic,0,Orange);
11)if(buyAlert(Symbol(),"  Buy  ",Ask,"  ",Percent,"%  ",Lot_rounded);
if(
sellAlert(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 процента от свободных среств. Как токой подщет должен выглядеть ?
Гинтарас

Последний раз редактировалось NSerega; 04.11.2013 в 01:19.
30.10.2013, 12:13
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,032 раз(а) / Репутация: 9032
  • Отправить сообщение для eevviill с помощью Skype™
...
И еще такой вопрос. Как посчитать величину лота , если у меня стоп лос 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

Последний раз редактировалось eevviill; 30.10.2013 в 13:04.
04.11.2013, 00:54
Аватар для uran2012
uran2012 uran2012 вне форума Новичок форума
Регистрация: 29.12.2012 / Сообщений: 65
Поблагодарили 18 раз(а) / Репутация: 19
Привет Всем! Подскажите как вписать работающий тейк профит !!!! не получается ничего!!!

Скрытый текст

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(NULL0ПериодСигналаПериодУсреднения0PRICE_CLOSEMODE_UPPERСмещение);
      
ИндюкВВ2[Смещение] = iBands(NULL0ПериодСигналаПериодУсреднения0PRICE_CLOSEMODE_LOWERСмещение);
      if (
Close[Смещение] > ИндюкВВ1[Смещение 1]) Сигнал 1;
      if (
Close[Смещение] < ИндюкВВ2[Смещение 1]) Сигнал = -1;
      if (
Сигнал && ИндюкВВ2[Смещение] < ИндюкВВ2[Смещение 1]) ИндюкВВ2[Смещение] = ИндюкВВ2[Смещение 1];
      if (
Сигнал && ИндюкВВ1[Смещение] > ИндюкВВ1[Смещение 1]) ИндюкВВ1[Смещение] = ИндюкВВ1[Смещение 1];
      
МатрицаСигналов2[Смещение] = ИндюкВВ1[Смещение] + (Коэффициент1 1) / 2.0 * (ИндюкВВ1[Смещение] - ИндюкВВ2[Смещение]);
      
МатрицаСигналов1[Смещение] = ИндюкВВ2[Смещение] - (Коэффициент1 1) / 2.0 * (ИндюкВВ1[Смещение] - ИндюкВВ2[Смещение]);
      if (
Сигнал && МатрицаСигналов1[Смещение] < МатрицаСигналов1[Смещение 1]) МатрицаСигналов1[Смещение] = МатрицаСигналов1[Смещение 1];
      if (
Сигнал && МатрицаСигналов2[Смещение] > МатрицаСигналов2[Смещение 1]) МатрицаСигналов2[Смещение] = МатрицаСигналов2[Смещение 1];
      if (
Сигнал 0) {
         if (
Разрешение1 && Матрица1[Смещение 1] == -1.0) {
            
Матрица3[Смещение] = МатрицаСигналов1[Смещение];
            
Матрица1[Смещение] = МатрицаСигналов1[Смещение];
            if (
Разрешение2 0Матрица5[Смещение] = МатрицаСигналов1[Смещение];
            if (
ВключитьСигнализацию == TRUE && Смещение == && !ПодтверждениеПокупка) {
               
Максималка 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 && Матрица2[Смещение 1] == -1.0) {
            
Матрица4[Смещение] = МатрицаСигналов2[Смещение];
            
Матрица2[Смещение] = МатрицаСигналов2[Смещение];
            if (
Разрешение2 0Матрица6[Смещение] = МатрицаСигналов2[Смещение];
            if (
ВключитьСигнализацию == TRUE && Смещение == && !ПодтверждениеПродажа) {
               
Максималка 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(iSELECT_BY_POSMODE_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()-1i>=0i--)
            {
OrderSelect(iSELECT_BY_POSMODE_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 (
EmailSendMail(ЗаголовокТекстПисьма);
   }
}   
//+------------------------------------------------------------------+
//Возвращает цену или лот последнего ордера
//+------------------------------------------------------------------+
double ПоследнийЗакрОрдер(string тип,string инф)
{  
double профит;
   
int iномер=0;
      
OrderSelect(ПоследнийЗакрытый(тип), SELECT_BY_TICKET);
                     
профит=OrderProfit();
 if(
инф=="профит")  return(профит);

[свернуть]

Последний раз редактировалось NSerega; 04.11.2013 в 01:18.
04.11.2013, 01:32
Регистрация: 08.02.2009 / Адрес: Ростов-на-Дону / Сообщений: 547
Поблагодарили 4,112 раз(а) / Репутация: 4116
Привет Всем! Подскажите как вписать работающий тейк профит !!!! не получается ничего!!!
тейк профит (и стоп-лосс) указывается в функции 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(ticketSELECT_BY_TICKET))  {
         
modify=OrderModify(ticketOrderOpenPrice(), 0OrderOpenPrice()+Профит*Point,0,CLR_NONE);
         if(!
modify)  {  error=GetLastError();   Print("Modify Error = "error,"    ",ErrorDescription(error));  break;   }
       }
     }
... 
[свернуть]
Надо только выучиться ждать,
Надо быть спокойным и упрямым...
---------------------------------------------------------------------------
Слушай всех, прислушивайся к немногим, решай сам. (Чанг Инг Ю)
---------------------------------------------------------------------------

Последний раз редактировалось NSerega; 04.11.2013 в 13:08.
04.11.2013, 11:17
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,032 раз(а) / Репутация: 9032
  • Отправить сообщение для eevviill с помощью Skype™
Привет Всем! Подскажите как вписать работающий тейк профит !!!! не получается ничего!!!
http://forexsystemsru.com/indikatory...tml#post596494
04.11.2013, 13:24
Аватар для uran2012
uran2012 uran2012 вне форума Новичок форума
Регистрация: 29.12.2012 / Сообщений: 65
Поблагодарили 18 раз(а) / Репутация: 19
Возник новый вопрос: КАК заставить открывать ордер только один раз!!?
Пример:
Линия пересекает уровень 0, и открывается сделка. Сделка закрывается по тейкпрофиту , либо по стоплосс.

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

PHP код:
int start()
  {
  
double tp,sl;
  if (
Digits==2||Digits==4){tp=TekeProfit*Pointsl=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>LevelOrderSend(Symbol(),OP_BUY,Lot,Ask,100,Ask-sl,Ask+tp,NULL,Magic,0,CLR_NONE);
    }
//----
   
return(0);
  } 
Ps. Начинающий сильно не пинать)

Последний раз редактировалось uran2012; 04.11.2013 в 13:41. Причина: исправление
04.11.2013, 13:50
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,032 раз(а) / Репутация: 9032
  • Отправить сообщение для eevviill с помощью Skype™
Возник новый вопрос: КАК заставить открывать ордер только один раз!!?
Пример:
Линия пересекает уровень 0, и открывается сделка. Сделка закрывается по тейкпрофиту , либо по стоплосс.

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

PHP код:
int start()
  {
  
double tp,sl;
  if (
Digits==2||Digits==4){tp=TekeProfit*Pointsl=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>LevelOrderSend(Symbol(),OP_BUY,Lot,Ask,100,Ask-sl,Ask+tp,NULL,Magic,0,CLR_NONE);
    }
//----
   
return(0);
  } 
Ps. Начинающий сильно не пинать)
Там же есть функция подсчета ордеров.
04.11.2013, 14:05
Аватар для uran2012
uran2012 uran2012 вне форума Новичок форума
Регистрация: 29.12.2012 / Сообщений: 65
Поблагодарили 18 раз(а) / Репутация: 19
Там же есть функция подсчета ордеров.
возможно не работает, либо из за того что индикатор рисует линию при появлении нового бара??
как написать код для закрытия при противоположном сигнале??
04.11.2013, 20:34
Аватар для Evgen1y
Evgen1y Evgen1y вне форума Активный участник
Регистрация: 14.06.2013 / Сообщений: 74
Поблагодарили 34 раз(а) / Репутация: 35
Присоединяюсь к запросу. Джентльмены программеры, не поможете особо одаренным?
Решил проблему используя этот индюк:
05.11.2013, 20:53
Аватар для Dobryj
Dobryj Dobryj вне форума Почётный гражданин
Регистрация: 07.06.2012 / Сообщений: 222
Поблагодарили 294 раз(а) / Репутация: 326
Добрый Вечер всем !
помогите разрешить проблему ,пишу скрипт идея такая при установке на график рисуются 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);
}
//+------------------------------------------------------------------+
[свернуть]

Последний раз редактировалось NSerega; 06.11.2013 в 01:41.
06.11.2013, 09:21
Аватар для _SERG_
_SERG_ _SERG_ вне форума Активный участник
Регистрация: 21.07.2009 / Сообщений: 271
Поблагодарили 86 раз(а) / Репутация: 86
Я так понимаю, что для того, чтобы выполнить второе условие, о перерисовке вертикальной линии, в скрипте должны быть данные о первой линии, которые можно будет сравнить с новыми её параметрами (после изменения), для того чтобы принять решение о перерисовке второй линии. (Про время не забудь.)
В общем, надо бы переменных добавить. Дальше по тексту.
Ну и то что в 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(), а то как отрисовываться будет?

Последний раз редактировалось _SERG_; 06.11.2013 в 09:24.
06.11.2013, 11:18
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Добрый Вечер всем !
помогите разрешить проблему ,пишу скрипт идея такая при установке на график рисуются 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() назначить новые параметры.
06.11.2013, 18:33
Аватар для Dobryj
Dobryj Dobryj вне форума Почётный гражданин
Регистрация: 07.06.2012 / Сообщений: 222
Поблагодарили 294 раз(а) / Репутация: 326
Ничего удалять не надо. Надо просто используя 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 баров , с чем это связано ?и как исправить ?
06.11.2013, 18:52
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,032 раз(а) / Репутация: 9032
  • Отправить сообщение для eevviill с помощью Skype™
Спасибо помогло !
появилась новая проблемка

Скрытый текст

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); 
Dobryj 
06.11.2013, 20:35
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Спасибо помогло !
появилась новая проблемка

Скрытый текст

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() с нужными параметрами.
07.11.2013, 13:48
Аватар для Dobryj
Dobryj Dobryj вне форума Почётный гражданин
Регистрация: 07.06.2012 / Сообщений: 222
Поблагодарили 294 раз(а) / Репутация: 326
Проблему сходу не решу(да и ветка не та), но
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); 
Сделал как сказали но проблема не ушла
всегда есть погрешность 1-2 бара !скрипт тестирую на дневном тайме
я уже думаю что это как то выходные всю картинку портят ...
может есть еще мысли как данный баг исправить
вот код

Скрытый текст

//+------------------------------------------------------------------+
//| 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");
}
[свернуть]
07.11.2013, 14:07
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,032 раз(а) / Репутация: 9032
  • Отправить сообщение для eevviill с помощью Skype™
Сделал как сказали но проблема не ушла
всегда есть погрешность 1-2 бара !скрипт тестирую на дневном тайме
я уже думаю что это как то выходные всю картинку портят ...
может есть еще мысли как данный баг исправить
вот код
...
Ты лучше фото сделай что ты хочешь.
Dobryj 
07.11.2013, 14:18
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Сделал как сказали но проблема не ушла
всегда есть погрешность 1-2 бара !скрипт тестирую на дневном тайме
я уже думаю что это как то выходные всю картинку портят ...
может есть еще мысли как данный баг исправить
Правильно думаешь. Ты хочешь смещение на 50 баров, а вычисляешь смещение на 50 суток. Бар не каждые сутки бывает.
Рисуй палку на Time[i0-A], будет как надо.
07.11.2013, 14:26
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Правильно думаешь. Ты хочешь смещение на 50 баров, а вычисляешь смещение на 50 суток. Бар не каждые сутки бывает.
Рисуй палку на Time[i0-A], будет как надо.
Так я ему об этом и говорил чуть выше.
Только зря наверное оставил это в его тексте под спойлером, как было у него. Может не видел.
Ответить


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 12:35. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO