Ответить
06.04.2018, 21:17
Аватар для KriKs-Fx
KriKs-Fx KriKs-Fx вне форума Интересующийся
Регистрация: 06.04.2018 / Адрес: Moscow / Сообщений: 29
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Т.Е. if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) заменить на bool x=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ???
07.04.2018, 01:31
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
Т.Е. if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) заменить на bool x=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ???
Нет, конечно! Я объяснил возможные варианты и в чем их отличие. Вариант с if оптимальный.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
07.04.2018, 06:22
Аватар для KriKs-Fx
KriKs-Fx KriKs-Fx вне форума Интересующийся
Регистрация: 06.04.2018 / Адрес: Moscow / Сообщений: 29
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Спасибо.... За науку)))
07.04.2018, 07:47
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
Спасибо.... За науку)))
Удачи!))
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
09.04.2018, 18:50
Аватар для Flank
Flank Flank вне форума Новичок форума
Регистрация: 09.01.2018 / Сообщений: 18
Поблагодарили 7 раз(а) / Репутация: 8
Ребята, подскажите пожалуйста, как закрыть ордера с убытком, у меня не получается, вызываю вот эту функцию, ошибок не выдает, закрывает только профитные
Код:
void CloseAllOpendOrders()
{bool bw,bc;
   for(int t=0;t<=OrdersTotal();t++)
      {bw=OrderSelect(t,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY){
            bc=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
               if(bc == false) 
                  Print("#",OrderTicket(),"  Error: ",GetLastError()," Функция: OrderClose(",OrderTicket(),",",OrderLots(),",",Bid,",",Slippage,")");
         }                  
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType()== OP_SELL){
            bc=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Yellow);
               if(bc == false)
                  Print("#",OrderTicket(),"  Error: ",GetLastError()," Функция: OrderClose(",OrderTicket(),",",OrderLots(),",",Ask,",",Slippage,")");
         }               
      }
}
И правильно ли я там написал обработку ошибок, если нет, поправьте пожалуйста. И еще один вопрос, покажите ссылку где описанно как работать с мышкой и делать кнопки в советнике.
09.04.2018, 19:02
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
Привет! Могу предложить рабочие версии в моей разработке по ссылке ниже. Там же и можно по кнопкам ориентировочно "набить руку". Обработка ошибок - последнее, что нужно учитывать - важно их не допускать в коде.
Простейшая функция закрытия всех ордеров :
PHP код:
void CloseAll()
  {
   
int xx;
   for(
int i=OrdersTotal()-1i>=0i--)
      if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(
OrderType()==OP_BUY || OrderType()==OP_SELL)
            
xx=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,clrRed);

  } 
Только запускать ее нужно с предварительной проверкой - т.е. при каком-то событии, когда можно или нужно закрыть все ордера.
Многоуровневый виртуальный трейлинг
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 09.04.2018 в 19:12.
09.04.2018, 19:21
Аватар для Flank
Flank Flank вне форума Новичок форума
Регистрация: 09.01.2018 / Сообщений: 18
Поблагодарили 7 раз(а) / Репутация: 8
Спасибо, завтра попробую. Перед удалением естественно происходит проверка условий для закрытия всех ордеров, потом происходит вызов функции.
09.04.2018, 19:30
Аватар для Flank
Flank Flank вне форума Новичок форума
Регистрация: 09.01.2018 / Сообщений: 18
Поблагодарили 7 раз(а) / Репутация: 8
А почему у вас ХХ int? OrderClose возвращет же bool или я ошибаюсь?
09.04.2018, 19:30
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
Спасибо, завтра попробую. Перед удалением естественно происходит проверка услови для закрытия всех ордеров, потом происходит вызов функции.
По поводу проверки на правильность работы кода - уже не первый раз рассказываю: в 2012 году на чемпионате АТС2012 сов из около 3500 получили допуск меньше 500 (из 117 стран) и отсеяны были ве совы из-за малейшей огрехи - даже если терминал выдавал предупреждение о том, что не хватает средств для открытия очередного ордера. Правильно работают те проги, которые не допускают ошибок, а не те, которые анализируют допущенные ошибки.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
09.04.2018, 19:33
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
А почему у вас ХХ int? OrderClose возвращет же bool или я ошибаюсь?
Это без разницы. Переменные bool (true и false) имеют интовское значение 1 и 0 соответственно и в программе можно использовать любой вариант.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
09.04.2018, 19:42
Аватар для Flank
Flank Flank вне форума Новичок форума
Регистрация: 09.01.2018 / Сообщений: 18
Поблагодарили 7 раз(а) / Репутация: 8
По поводу проверки на правильность работы кода - уже не первый раз рассказываю: в 2012 году на чемпионате АТС2012 сов из около 3500 получили допуск меньше 500 (из 117 стран) и отсеяны были ве совы из-за малейшей огрехи - даже если терминал выдавал предупреждение о том, что не хватает средств для открытия очередного ордера. Правильно работают те проги, которые не допускают ошибок, а не те, которые анализируют допущенные ошибки.
Я с вами согласен, но это же не готовый робот, я пишу его и отлаживаю, процесс отладки без анализа ошибок я не представляю. Более того я только учусь.
09.04.2018, 19:51
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
Я с вами согласен, но это же не готовый робот, я пишу его и отлаживаю, процесс отладки без анализа ошибок я не представляю. Более того я только учусь.
Это понятно. Если смогу чем-то помочь - постараюсь. А по поводу анализа ошибок - терминал Вам выдаст те ошибки и сообщения о них, над которыми нужно работать, а в коде сова пытаться искать ошибки, которых, возможно, нет, - это тупо тратить свое и процессорное время.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
15.04.2018, 12:40
Аватар для KriKs-Fx
KriKs-Fx KriKs-Fx вне форума Интересующийся
Регистрация: 06.04.2018 / Адрес: Moscow / Сообщений: 29
Поблагодарили 1 раз в 1 сообщении / Репутация: 2

Вопрос Увеличение лота после StopLoss + Количество раз.

Господа программисты! Подскажите как написать код для увеличения Лота после закрытия предшествующего ордера по StopLoss и вывести опцию в настройки количество раз увеличения Лота?
15.04.2018, 15:24
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
Господа программисты! Подскажите как написать код для увеличения Лота после закрытия предшествующего ордера по StopLoss и вывести опцию в настройки количество раз увеличения Лота?
Можешь так попробовать, если в рынке только один ордер постоянно на данном инструменте:
PHP код:
extern double Lot=0.01// Базовый лот
extern double MultLot1=2// Коэффициент умножения лота (1 - отключен)
extern double MultLot2=0.01// Коэффициент прибавления лота (0 - отключен)
extern int    Counts=5// Количество увеличений лота
extern int    Magic=123;
//--------
double CountLots()
 {
  
double lot=Lot;
  
double maxlot=Lot;
  for(
int c=1c<=Countsc++) maxlot=NormalizeDouble(maxlot*MultLot1+MultLot2,2);
  for(
int i=OrdersHistoryTotal()-1i<=0i--)
    if(
OrderSelect(i,SELECT_BY_POSMODE_HISTORY))
      if(
OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
        if(
StringFind(OrderComment(),"sl") >=0)
          if((
lot=NormalizeDouble(OrderLots()*MultLot1+MultLot2,2))<=maxlot) return(lot);
  return(
Lot);
 } 
Только функцию нужно запускать с условием, что в рынке нет ордера на данный момент на данном инструменте с данным магиком.
Есть один момент: стоплосс может закрыть ордер в плюс, если это обычный трал и тогда стоит заменить строку
PHP код:
if(StringFind(OrderComment(),"sl") >=0
на
PHP код:
if(OrderProfit()<0.0
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 15.04.2018 в 15:40.
15.04.2018, 21:14
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
for(int i=OrdersHistoryTotal()-1; i<=0; i--)
Дико извиняюсь - стрелку в цикле не в ту сторону поставил - чисто опечатался:
PHP код:
for(int i=OrdersHistoryTotal()-1i>=0i--) 
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
15.04.2018, 21:52
Аватар для KriKs-Fx
KriKs-Fx KriKs-Fx вне форума Интересующийся
Регистрация: 06.04.2018 / Адрес: Moscow / Сообщений: 29
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Благодарю Вас уважаемый !!! (Все ошибаются ) Подскажите пожалйуста как правильно вставить код в советник?

//--------------------------------------------------------------------*/
extern int KPeriod = 6;
extern int DPeriod = 3;
extern int Slowing = 5;
extern int LevelSell = 75;
extern int LevelBuy = 25;
extern int Stoploss = 10; //стоплосс
extern int Takeprofit = 15; //тейкпрофит
extern int TrailingStop = 0; //трейлингстоп, если 0, то нет трейлинга
extern double Lot = 0.10; //лот
extern int slippage = 1; // проскальзывание
extern int Magic = 2222;
//--------------------------------------------------------------------
double STOPLEVEL;

//-------------------------------------------------------------------
void OnTick()
{
if (!IsTradeAllowed())
{
return;
}
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
double OSL,OTP,OOP,StLo=0,SL=0,TP=0;
int i,b=0,s=0,tip;
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
tip = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OTP = NormalizeDouble(OrderTakeProfit(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
SL=OSL;TP=OTP;
if (tip==OP_BUY)
{
b++;
if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
{
SL = NormalizeDouble(OOP - Stoploss * Point,Digits);
}
if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
{
TP = NormalizeDouble(OOP + Takeprofit * Point,Digits);
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
{
StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (StLo >= OOP && StLo > OSL) SL = StLo;
}
if (SL != OSL || TP != OTP)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error OrderModify <<",(GetLastError()),">> ");
}
}
if (tip==OP_SELL)
{
s++;
if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
{
SL = NormalizeDouble(OOP + Stoploss * Point,Digits);
}
if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
{
TP = NormalizeDouble(OOP - Takeprofit * Point,Digits);
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
{
StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);
if (StLo <= OOP && (StLo < OSL || OSL==0)) SL = StLo;
}
if (SL != OSL || TP != OTP)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error OrderModify <<",(GetLastError()),">> ");
}
}
}
}
}
//----------------------------------------------------------------

double Stoch0 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SM A,0,MODE_MAIN,0);
double Signl0 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SM A,0,MODE_SIGNAL,0);

double Stoch1 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SM A,0,MODE_MAIN,1);
double Signl1 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SM A,0,MODE_SIGNAL,1);

//-----------------------------------------------------------------------
if (Stoch0>Signl0 && Stoch1<Signl1 && Stoch0<LevelBuy)
{
if (b==0)
{
if (OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL, Magic,0,clrNONE)==-1) Print("Ошибка открытия ордера <<",(GetLastError()),">> ");
}
}
if (Stoch0<Signl0 && Stoch1>Signl1 && Stoch0>LevelSell)
{
if (s==0)
{
if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bi d,Digits),slippage,0,0,NULL,Magic,0,clrNONE)==-1) Print("Ошибка открытия ордера <<",(GetLastError()),">> ");
}
}
return;
}
//--------------------------------------------------------------------

Грызу "гранит" MQL
16.04.2018, 01:28
Аватар для vladradon
vladradon vladradon на форуме Почётный гражданин
Регистрация: 12.02.2015 / Сообщений: 719
Поблагодарили 375 раз(а) / Репутация: 382
Подскажите пожалйуста как правильно вставить код в советник?
Немного доработал функцию и воткнул в ваш код. Там желательно сделать так, чтобы при стопуровне больше стоплосса или тейкпрофита, они автоматом увеличивались до стопуровня+1. А то если меньше, то стопы и тейки не выставляются вообще.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 16.04.2018 в 01:31.
16.04.2018, 05:31
Аватар для KriKs-Fx
KriKs-Fx KriKs-Fx вне форума Интересующийся
Регистрация: 06.04.2018 / Адрес: Moscow / Сообщений: 29
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Спасибо Вам большое!!! Но есть один момент! как исправить код что бы Советник не реагировал на "шум" т.е. После открытия ордера как пример на BUY во время тренда ордера на Sell не открывались? и наоборот.
16.04.2018, 05:39
Аватар для LexeR
LexeR LexeR на форуме Активный участник
Регистрация: 18.10.2016 / Сообщений: 85
Поблагодарили 47 раз(а) / Репутация: 48
Спасибо Вам большое!!! Но есть один момент! как исправить код что бы Советник не реагировал на "шум" т.е. После открытия ордера как пример на BUY во время тренда ордера на Sell не открывались? и наоборот.
Вы как тренд фильтровать собираетесь? С помощью машек?
16.04.2018, 05:48
Аватар для KriKs-Fx
KriKs-Fx KriKs-Fx вне форума Интересующийся
Регистрация: 06.04.2018 / Адрес: Moscow / Сообщений: 29
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
MA Совсем тут не причём. Есть другие индикаторы а Stochastik только как посредник один из факторов стратегии.
Ответить

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


Опции темы

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

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



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


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