Ответить
01.12.2017, 01:57
Аватар для malojorsk
malojorsk malojorsk вне форума Новичок форума
Регистрация: 20.02.2017 / Сообщений: 41
Поблагодарили 4 раз(а) / Репутация: 5

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

[PHP]double isCloseLastPosByStopTrade(string sy,int op,int mn)
{
datetime t=0;
double profit;
int i,k=OrdersHistoryTotal();

if(sy=="0") sy=Symbol();
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==sy) // || sy=="")
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op<0 || OrderType()==op)
{
if(mn<0 || OrderMagicNumber()==mn)
{
if(t<OrderCloseTime())
{
t=OrderCloseTime();
profit=OrderProfit();
}
}
}
}
}
}
}
return(profit);
}
[свернуть]
Спасибо, подскажите я правильно вызываю эту функцию?
нужно умножение лота на 2 при убытке.
в данной конструкции лот с 0,01 сразу умножает до 0,08
переменная lots - идет в настройках
переменная Lot - стоит в параметрах ордеров

Код:
 if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)>0)
         {Lot=lots;
        
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)<0)
         {Lot=Lot*2;
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)>0)
         {Lot=lots;
         
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)<0)
         {Lot=Lot*2;
         
         }

Последний раз редактировалось malojorsk; 01.12.2017 в 01:59.
01.12.2017, 12:51
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 2,066
Поблагодарили 10,246 раз(а) / Репутация: 10259
Спасибо, подскажите я правильно вызываю эту функцию?
нужно умножение лота на 2 при убытке.
в данной конструкции лот с 0,01 сразу умножает до 0,08
переменная lots - идет в настройках
переменная Lot - стоит в параметрах ордеров

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

Код:
 if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)>0)
         {Lot=lots;
        
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)<0)
         {Lot=Lot*2;
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)>0)
         {Lot=lots;
         
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)<0)
         {Lot=Lot*2;
         
         }
[свернуть]
Нет, малость не то. Ф-ция isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic) возвращает профит последнего закрытого ордера, вопрос в том, что Вы хотите: что бы увеличение лотности происходило разово, т.е., поймали лося и следующий вход будет увеличенным лотом, при этом, если снова поймали лося, то вход будет лотом стартовый лот * 2, т.е., каждый последующий вход при непрерывном получении лося будет только в размере стартовый лот * 2 или увеличивать размер лота после последней закрытой позиции на лот закрытой позиции * 2? Если второй вариант, то предыдущую ф-цию нужно изменить, а именно: получать значение лота при убытке последней закрытой позиции и от этого значения устанавливать лотность для нового ордера.
04.12.2017, 09:04
Аватар для aonisya
aonisya aonisya вне форума Новичок форума
Регистрация: 23.12.2015 / Сообщений: 31
Поблагодарили 13 раз(а) / Репутация: 13
Господа, возможно пишу не в тему, так что сильно не пинайте. А если захотите, то пинайте в нужном мне направлении.
Кто-нибудь сможет переделать индикатор с mql5 в mql4?
05.12.2017, 03:51
Аватар для Vladimir90
Vladimir90 Vladimir90 вне форума Интересующийся
Регистрация: 04.12.2017 / Сообщений: 3
Поблагодарили 0 раз(а) / Репутация: 1
Ребята, привет. Подскажите пожалуйста.
Не могу сообразить:
Вот задача:
К примеру цена Bid находится на уровне 1,56 (считаем что это круглый уровень) и запоминаем последнее время нахождения цены Bid на отметке 1,56 - к примеру будет точка Х1. Далее цена к примеру пошла вверх и задела Bid уровень 1,57 - создаем точку Х2, и сравниваем время точки Х2 и точки Х1, чтобы разница в секундах была не больше времени t1 и не меньше времени t3, и проверяем чтобы цена на этом уровне Х2(1,57) была больше времени t2(тоесть ищем этот уровень в прошлом, и находим для него время(это найденное время вычитаем из настоящего и разница должна быть больше t2(задаем вручную)).
Нажмите на изображение для увеличения
Название: ыыыы.png
Просмотров: 37
Размер:	49.3 Кб
ID:	287461
07.12.2017, 00:28
Аватар для panand
panand panand вне форума Новичок форума
Регистрация: 20.01.2017 / Адрес: планета Земля / Сообщений: 51
Поблагодарили 10 раз(а) / Репутация: 7
Господа,день добрый!
Приложите готовый или напишите код фильтра для советника,пожалуйста, который позволит советнику открывать сделку,любую, при условии - если в течения указанной доли в секундах подряд появляется тик(Volume),советнику разрешается открывать сделку, но если тик не появляется,то запрещает сделку.
Например,указываю 1 секунду,где (до 1 секунды) при появления тика за каждое указанное время подряд,начиная с первой секунды,то допускает сделку при его сигнале.
Если тик не совпадает со временем,делая паузу,пропускает время - сделка запрещена.
Это как аналог фильтра ограничения сделки при расширяющем спреде.
Спасибо за внимание.
07.12.2017, 01:24
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 2,066
Поблагодарили 10,246 раз(а) / Репутация: 10259
Господа,день добрый!
Приложите готовый или напишите код фильтра для советника...
Ветка то, о вопросах, а заказы в другом месте.
Смотри в сторону ф-ции: GetTickCount(), в справке есть пример, логика в нем та же, что тебе нужно.
07.12.2017, 22:11
Аватар для блондинка
блондинка блондинка вне форума Почётный гражданин
Регистрация: 21.11.2012 / Адрес: Санкт-Петербург / Сообщений: 260
Поблагодарили 403 раз(а) / Репутация: 404
Доброй ночи!
Вопрос такой с вашего позволения)
Стрелочный индикатор.Если условие для стрелки выполняется в основном цикле вычислений,то на закрытии свечи рисуется стрелка(вверх или вниз в зависимости от совпадения условий)
Надо организовать внутренний цикл, что бы после каждой стрелки на следующих N барах стрелок этого же направления не было (не отображалось)
Вот пример основного (обычного)цикла стрелки:
int start() {
int limit, i, counter;
double Range, AvgRange;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(i = 1; i <= limit; i++) {

counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;

r0=RSI(Symbol(),0,Rsi_period,RSIpriceType,i);

CrossUp[i] = 0;
CrossDown[i] = 0;

if (r < 20)
{
CrossUp[i] = Low[i] - Range*0.75;
}
else if (r > 80)
{
CrossDown[i] = High[i] + Range*0.75;
}
}
return(0);
}

Это означает, что когда RSI будет выше уровня 80, то на всех свечах будут стрелки вниз (серии подряд). Для вверх уровень 20.
В этот цикл и вставить ещё запрет на отображение N стрелок сразу после первой(не важно выполнение условия основного цикла).Если бы было 2-3 стрелки подряд, это понятно как сделать(каждый раз проверят буфер на предыдущем баре)
А для большего количества(до 10 штук) это надо более красиво сделать.
Как?Посоветуйте.
Спасибо за внимание!Удачи!
Happiness is a choice.And it is free.Play on.
_____________________-Roy H.WiIIiams.

Последний раз редактировалось блондинка; 07.12.2017 в 22:14.
07.12.2017, 22:42
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 417
Поблагодарили 205 раз(а) / Репутация: 212
Сообщение от: блондинка
А для большего количества(до 10 штук) это надо более красиво сделать.
Как?Посоветуйте.
Привет! Попробуй такой вариант. Код не полный, поэтому не проверял на графике, но смысл, думаю, понятен. Параметр N, предположительно, внешний.
PHP код:
   int N1=0,N2=0;
   
int limit,i,counter;
   
double Range,AvgRange;
   
int counted_bars=IndicatorCounted();
   if(
counted_bars<0) return(-1);
   if(
counted_bars>0counted_bars--;
   
limit=Bars-counted_bars;
   for(
i=1i<=limiti++) 
     {
      
counter=i;
      
Range=0;
      
AvgRange=0;
      for(
counter=i;counter<=i+9;counter++)
        {
         
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
        }
      
Range=AvgRange/10;

      
r0=RSI(Symbol(),0,Rsi_period,RSIpriceType,i);

      
CrossUp[i]=0;
      
CrossDown[i]=0;
      if(
N1>0N1--;
      if(
N2>0N2--;
      if(
r<20 && N1<1)
        {
         
CrossUp[i]=Low[i]-Range*0.75;
         
N1=N;
        }
      if(
r>80 && N2<1)
        {
         
CrossDown[i]=High[i]+Range*0.75;
         
N2=N;
        }
     } 
Или такой вариант:
PHP код:
   int limit,i,counter;
   
double Range,AvgRange;
   
int counted_bars=IndicatorCounted();
   if(
counted_bars<0) return(-1);
   if(
counted_bars>0counted_bars--;
   
limit=Bars-counted_bars;
   
int N1=limitN2=limit;
   for(
i=limiti>=1i--) 
     {
      
counter=i;
      
Range=0;
      
AvgRange=0;
      for(
counter=i+9;counter>=i;counter--)
        {
         
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
        }
      
Range=AvgRange/10;

      
r0=RSI(Symbol(),0,Rsi_period,RSIpriceType,i);

      
CrossUp[i]=0;
      
CrossDown[i]=0;

      if(
r<20 && N1-i>=N)
        {
         
CrossUp[i]=Low[i]-Range*0.75;
         
N1=i;
        }
      if(
r>80 && N2-i>=N)
        {
         
CrossDown[i]=High[i]+Range*0.75;
         
N2=i;
        }
     } 
В первом варианте, скорее всего, тоже нужно перенаправить основной и внутренний циклы с конца на начало.
Можно вечно смотреть на то, как горит огонь, как течет вода, и как работает трал...

Последний раз редактировалось vladradon; 07.12.2017 в 23:10.
07.12.2017, 23:09
Аватар для блондинка
блондинка блондинка вне форума Почётный гражданин
Регистрация: 21.11.2012 / Адрес: Санкт-Петербург / Сообщений: 260
Поблагодарили 403 раз(а) / Репутация: 404
Привет! Попробуй такой вариант. Код не полный, поэтому не проверял на графике, но смысл, думаю, понятен.
Ого!И это называется простой язык?)))Мне бы не догадаться.
Второй код работает!!!
Большое спасибо!
Happiness is a choice.And it is free.Play on.
_____________________-Roy H.WiIIiams.

Последний раз редактировалось блондинка; 07.12.2017 в 23:38.
08.12.2017, 17:30
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 417
Поблагодарили 205 раз(а) / Репутация: 212
Сообщение от: блондинка
Второй код работает!!!
Он и первый должен работать - первый более универсальный, но в нем (как и в оригинале) идет расчет в основном цикле от последних данных к более старым - т.е. сначала получаем последние резы, а относительно них уже более ранние по графику, что теоретически не верно, т.к. i - это смещение для расчетов по барам относительно текущего (нулевого) бара и значит все циклы должны работать от большего i к меньшему, как я исправил во втором варианте.
Можно вечно смотреть на то, как горит огонь, как течет вода, и как работает трал...
09.12.2017, 12:09
Аватар для блондинка
блондинка блондинка вне форума Почётный гражданин
Регистрация: 21.11.2012 / Адрес: Санкт-Петербург / Сообщений: 260
Поблагодарили 403 раз(а) / Репутация: 404
В первом варианте, скорее всего, тоже нужно перенаправить основной и внутренний циклы с конца на начало.
PHP код:
 СПАСИБО!!! 
Happiness is a choice.And it is free.Play on.
_____________________-Roy H.WiIIiams.

Последний раз редактировалось блондинка; 09.12.2017 в 12:11.
11.12.2017, 07:43
Аватар для Vladimir90
Vladimir90 Vladimir90 вне форума Интересующийся
Регистрация: 04.12.2017 / Сообщений: 3
Поблагодарили 0 раз(а) / Репутация: 1
Ребят, подскажите, как программно посмотреть круглый уровень в прошлом:нужно:
к примеру уровень(последний бид)
1,56000 05,12,2017 11-59 (время определяет сам)
1,55000 05,12,2017 09-00 (время определяет сам)
12.12.2017, 04:46
Аватар для _SERG_
_SERG_ _SERG_ вне форума Активный участник
Регистрация: 21.07.2009 / Сообщений: 289
Поблагодарили 96 раз(а) / Репутация: 96
Ребят, подскажите, как программно посмотреть круглый уровень в прошлом:нужно:
к примеру уровень(последний бид)
1,56000 05,12,2017 11-59 (время определяет сам)
1,55000 05,12,2017 09-00 (время определяет сам)
С какой точностью по времени тебе это надо?

Для примера:

1. Выбрал котировку. (Ценовой уровень.)
2. Выбрал ТФ.
3. Пролистал историю баров.
4. Нашел интервал времени (бар), где котировка попадает в этот интервал времени (бар).
5. Если надо более точное значение времени, перешел на более мелкий ТФ,
и в рамках найденного ранее интервала старшего ТФ, уточнился по времени.
Так до "минуты", если надо.

Всё простенько.

Последний раз редактировалось _SERG_; 12.12.2017 в 04:50.
18.12.2017, 09:08
Аватар для Vladimir90
Vladimir90 Vladimir90 вне форума Интересующийся
Регистрация: 04.12.2017 / Сообщений: 3
Поблагодарили 0 раз(а) / Репутация: 1
С какой точностью по времени тебе это надо?

Для примера:

1. Выбрал котировку. (Ценовой уровень.)
2. Выбрал ТФ.
3. Пролистал историю баров.
4. Нашел интервал времени (бар), где котировка попадает в этот интервал времени (бар).
5. Если надо более точное значение времени, перешел на более мелкий ТФ,
и в рамках найденного ранее интервала старшего ТФ, уточнился по времени.
Так до "минуты", если надо.

Всё простенько.
Спасибо большое, буду пытаться реализовать код
27.12.2017, 19:15
Аватар для Артмен
Артмен Артмен на форуме Интересующийся
Регистрация: 18.12.2017 / Адрес: Планета:"Земля". / Сообщений: 24
Поблагодарили 2 раз(а) / Репутация: 3
Здравствуйте! Помогите пожалуйста исправить ошибку - return value of 'OrderClose' should be checked.
int start()
{
//----
for (int j = 0; j < OrdersTotal(); j++){
if (OrderSelect(j, SELECT_BY_POS)){
if (OrderSymbol() == Symbol()&& (OrderMagicNumber()==magic || magic==0)){
if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT) && Bid-OrderOpenPrice()>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT) && OrderOpenPrice()-Ask>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Ask,slip,0);
}
}
}
//----
return(0);
}
27.12.2017, 20:29
Аватар для _SERG_
_SERG_ _SERG_ вне форума Активный участник
Регистрация: 21.07.2009 / Сообщений: 289
Поблагодарили 96 раз(а) / Репутация: 96
Сообщение от: Артмен
Здравствуйте! Помогите пожалуйста исправить ошибку - return value of 'OrderClose' should be checked.
int start()
{
//----
for (int j = 0; j < OrdersTotal(); j++){
if (OrderSelect(j, SELECT_BY_POS)){
if (OrderSymbol() == Symbol()&& (OrderMagicNumber()==magic || magic==0)){
if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT) && Bid-OrderOpenPrice()>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT) && OrderOpenPrice()-Ask>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Ask,slip,0);
}
}
}
//----
return(0);
}
дет так:

#include <stdlib.mqh>
#include <stderror.mqh>
int ERR_CODE = 0;
//----
bool ERR = OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
ERR_CODE = GetLastError(); // Это чтобы наверняка отловить ошибку.
if(ERR == FALSE) { // Ну а тут, что сней дальше делать.
Print ("Ошибочка вышла, однако: [" + InegerToString(ERR_CODE) +"][" ErrorDiscription(ERR_CODE)+"]");
}

Ну а остальное, по аналогии.

Последний раз редактировалось _SERG_; 27.12.2017 в 20:34.
27.12.2017, 20:37
Аватар для Артмен
Артмен Артмен на форуме Интересующийся
Регистрация: 18.12.2017 / Адрес: Планета:"Земля". / Сообщений: 24
Поблагодарили 2 раз(а) / Репутация: 3
Спасибо громадное!
28.12.2017, 08:17
Аватар для max020780
max020780 max020780 вне форума Новичок форума
Регистрация: 22.12.2009 / Сообщений: 51
Поблагодарили 12 раз(а) / Репутация: 11
День добрый .
нужна помощь.
есть индикатор рисующий стрелки подскажите как узнать какая стрелка на данный момент выводится на экран.
как это реализовать таким образом чтоб индикатор не устанавливать в окно терминала
28.12.2017, 14:48
Аватар для Артмен
Артмен Артмен на форуме Интересующийся
Регистрация: 18.12.2017 / Адрес: Планета:"Земля". / Сообщений: 24
Поблагодарили 2 раз(а) / Репутация: 3
дет так:

#include <stdlib.mqh>
#include <stderror.mqh>
int ERR_CODE = 0;
//----
bool ERR = OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
ERR_CODE = GetLastError(); // Это чтобы наверняка отловить ошибку.
if(ERR == FALSE) { // Ну а тут, что сней дальше делать.
Print ("Ошибочка вышла, однако: [" + InegerToString(ERR_CODE) +"][" ErrorDiscription(ERR_CODE)+"]");
}

Ну а остальное, по аналогии.
Здравствуйте _SERG_. Попробовал, но не вызывает библиотеку, "разрешить DLL" - галочка стоит, но всё равно выдаёт ошибку - can't open "C:\Users\Dell\AppData\Roaming\MetaQuotes\Terminal \7EA15B8B5AFB10E43823DC33101722BA\MQL4\include\std lib.mqh" include file
28.12.2017, 16:12
Аватар для _SERG_
_SERG_ _SERG_ вне форума Активный участник
Регистрация: 21.07.2009 / Сообщений: 289
Поблагодарили 96 раз(а) / Репутация: 96
Имя библиотеки не "std lib.mqh" а "stdlib.mqh".
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

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

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



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


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