Конечно есть - всё что душенька желает. надо только в кодобазу заглядывать и тестировать все подряд эксперты, там точно есть - я всегда так и делаю почти всех экспертов пере тестировал.
Я сам там не мало протестировал, вот на подходящий вариант Я не наткнулся.
Я думаю что задача в том, зделать второй трейлинг, как трейлинг стоп, только с задачей докупать контракт.
Ведь в позиции Лонг, при подтягивания трейлинг стоп, происходит открытие лимитного ордера (sell stop), если я не ошибаюсь.
И вот именно sell stop сменить на "BUY ORDER"
Вот такой трейлинг стоп у меня стоит
void Trailing()
{
if(InpTrailingStop==0)
return;
for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positionsif(m_position.SelectByIndex(i))
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingStop+ExtTrailingStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingStop+ExtTrailingStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingStop),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingStop+ExtTrailingStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingStop+ExtTrailingStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingStop),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
}
Я думал его оставить, и добавить типа trailing buy/sell
Помогите исправить индикатор, он не отображается в терминале MT5, при компиляции выдает ошибки.
//--- descriзгo#property description"Script cria objeto grбfico de \"Texto\"."//--- janela de exibiзгo dos parвmetros de entrada durante inicializaзгo do script#property script_show_inputs//--- entrada de parвmetros do scriptinputint IHistoryBars=25; // Check Historical Datainputstring InpFont="Tahoma"; // Font Typeinputint InpFontSize=7; // Size of fontsinputcolor UpColor=clrGold; // Cor Upinputcolor DwColor=clrRoyalBlue; // Cor Dwinputcolor HLColor=clrAqua; // Cor Centerinputbool InpBack=false; // Objeto de fundoinputbool InpSelection=false; // Destaque para moverinputbool InpHidden=true; // Ocultar na lista de objetosinputbool WithDigit=true; // Ocultar na lista de objetosinputlong InpZOrder=0; // Prioridade para clique do mouseint digits=0,extradig=0;
double InpAngle=0.0; // Вngulo de inclinaзгo em grausENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // Tipo de ancoragemdouble gBars=0;
double gTotalRates=0;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnInit()
{
digits= MathPow(10,_Digits-extradig);
if(WithDigit) extradig=1;
}
//+------------------------------------------------------------------+//| Mover ponto de ancoragem |//+------------------------------------------------------------------+bool TextMove(constlong chart_ID=0, // ID do grбficoconststring name="Text", // nome do objetodatetime time=0, // coordenada do ponto de ancoragem do tempodouble price=0) // coordenada do ponto de ancoragem do preзo
{
//--- se a posiзгo do ponto nгo estб definida, mover para a barra atual tendo o preзo Bidif(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erroResetLastError();
//--- mover o ponto de ancoragemif(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Cуdigo de erro = ",GetLastError());
return(false);
}
//--- sucesso na execuзгoreturn(true);
}
//+------------------------------------------------------------------+//| Verificar valores de ponto de ancoragem e definir valores padrгo |//| para aqueles vazios |//+------------------------------------------------------------------+void ChangeTextEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto nгo estб definido, serб na barra atualif(!time)
time=TimeCurrent();
//--- se o preзo do ponto nгo estб definido, ele terб valor Bidif(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+//| Custom indicator deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
ClearMyObjects();
Print("Deinit Value Chart, reason = "+IntegerToString(reason));
}
//+------------------------------------------------------------------+//| Value Chart | //+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &Time[],
constdouble &Open[],
constdouble &High[],
constdouble &Low[],
constdouble &Close[],
constlong &TickVolume[],
constlong &Volume[],
constint &Spread[])
{
//--- definir a forma como muitas vezes os textos serгo exibidosint scale=(int)ChartGetInteger(0,CHART_SCALE);
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS)+3;
double value;
digits=MathPow(10,_Digits-extradig);
//--- definir o passoint step=1;
switch(scale)
{
case0:
step=12;
break;
case1:
step=6;
break;
case2:
step=4;
break;
case3:
step=2;
break;
}
gTotalRates=rates_total;
gBars=bars;
for(int i=rates_total-1;i>rates_total-bars;i-=step)
{
if(Close[i]>Open[i])
{
// bullish candle
value=(Close[i]-Open[i])*digits;
//Print(Close[i]-Open[i], "->", Close[i]-Open[i]*digits);
TextCreate(0,"Text_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],(Close[i]+Open[i])/2,DoubleToString(value,extradig),InpFont,InpFontSize,
UpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder);
value=(Open[i]-Low[i]) *digits;
if(!TextCreate(0,"TextL_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],Low[i],DoubleToString(value,extradig),InpFont,InpFontSize,
HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) { return0; }
value=(High[i]-Close[i]) *digits;
if(!TextCreate(ChartID(),"TextH_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],High[i],DoubleToString(value,extradig),InpFont,InpFontSize,
HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) { return0; }
} else {
value=(Open[i]-Close[i]) *digits;
if(!TextCreate(ChartID(),"Text_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],(Close[i]+Open[i])/2,DoubleToString(value,extradig),InpFont,InpFontSize,
DwColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) { return0; }
value=(Close[i]-Low[i]) *digits;
if(!TextCreate(ChartID(),"TextL_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],Low[i],DoubleToString(value,extradig),InpFont,InpFontSize,
HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) { return0; }
value=(High[i]-Open[i]) *digits;
if(!TextCreate(ChartID(),"TextH_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],High[i],DoubleToString(value,extradig),InpFont,InpFontSize,
HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) { return0; }
}
}
ChartRedraw();
return0;
}
//+------------------------------------------------------------------+//| Trace Arrow Function |//+------------------------------------------------------------------+void Trace(string name,int sens,double price,datetime time,color couleur)
{
ObjectCreate(0,name,OBJ_ARROW,0,time,price);
if(sens==1)
ObjectSetInteger(0,name,OBJPROP_ARROWCODE,233);
if(sens==-1)
ObjectSetInteger(0,name,OBJPROP_ARROWCODE,234);
ObjectSetInteger(0,name,OBJPROP_COLOR,couleur);
ObjectSetInteger(0,name,OBJPROP_WIDTH,5);
}
//+------------------------------------------------------------------+//| Delete Arrow Function |//+------------------------------------------------------------------+ void ClearMyObjects()
{
string name;
int scale=(int)ChartGetInteger(0,CHART_SCALE);
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS)+3;
double value;
digits=MathPow(10,_Digits-extradig);
int step=1;
switch(scale)
{
case0:
step=12;
break;
case1:
step=6;
break;
case2:
step=4;
break;
case3:
step=2;
break;
}
for(int i=gTotalRates-1;i>gTotalRates-bars;i-=step)
{
if(!TextDelete(ChartID(),"Text_"+(string)i+(string)PERIOD_CURRENT)){}
if(!TextDelete(ChartID(),"TextH_"+(string)i+(string)PERIOD_CURRENT)){}
if(!TextDelete(ChartID(),"TextL_"+(string)i+(string)PERIOD_CURRENT)){}
//--- redesenhar o grбfico
}
ChartRedraw();
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| Alterar o texto do objeto |//+------------------------------------------------------------------+bool TextChange(constlong chart_ID=0, // ID do Grбficoconststring name="Text", // nome do objetoconststring text="Text") // texto
{
//--- redefine o valor de erroResetLastError();
//--- alterar texto do objetoif(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": falha ao alterar texto! Cуdigo de erro = ",GetLastError());
return(false);
}
//--- sucesso na execuзгoreturn(true);
}
//+------------------------------------------------------------------+//| Excluir objeto Texto |//+------------------------------------------------------------------+bool TextDelete(constlong chart_ID=0, // Id do Grбficoconststring name="Text") // nome do objeto
{
//--- redefine o valor de erroResetLastError();
//--- excluir o objetoif(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o objeto \"Texto\"! Cуdigo de erro = ",GetLastError());
return(false);
}
//--- sucesso na execuзгoreturn(true);
}
//+------------------------------------------------------------------+//| Criando objeto Texto |//+------------------------------------------------------------------+bool TextCreate(constlong chart_ID=0, // ID do grбficoconststring name="Text", // nome do objetoconstint sub_window=0, // нndice da sub-janeladatetime time=0, // ponto de ancoragem do tempodouble price=0, // ponto de ancoragem do preзoconststring text="Text", // o prуprio textoconststring font="Arial", // fonteconstint font_size=10, // tamanho da fonteconstcolor clr=clrRed, // corconstdouble angle=0.0, // inclinaзгo do textoconstENUM_ANCHOR_POINT anchor=ANCHOR_CENTER,// tipo de ancoragemconstbool back=false, // no fundoconstbool selection=false, // destaque para moverconstbool hidden=true, // ocultar na lista de objetosconstlong z_order=0) // prioridade para clicar no mouse
{
if(ObjectFind(chart_ID,name)==-1)
{
//--- definir as coordenadas de pontos de ancoragem, se eles nгo estгo definidos//--- redefine o valor de erroResetLastError();
//--- criar objeto Textoif(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar objeto \"Texto\"! Cуdigo de erro = ",GetLastError());
return(false);
}
//--- definir o textoObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- definir o texto fonteObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- definir tamanho da fonteObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- definir o вngulo de inclinaзгo do textoObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- tipo de definiзгo de ancoragemObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,ALIGN_CENTER);
//--- definir corObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- exibir em primeiro plano (false) ou fundo (true)ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo de mover o objeto com o mouseObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto grбfico na lista de objeto ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no grбficoObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
ObjectSetInteger(chart_ID,name,OBJPROP_TIME,time);
//--- sucesso na execuзгoreturn(true);
} else {
ChangeTextEmptyPoint(time,price);
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,ALIGN_CENTER);
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
ObjectSetInteger(chart_ID,name,OBJPROP_TIME,time);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- definir tamanho da fonteObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,100);
/*ObjectSetString(chart_ID,name,OBJPROP_FONT,Font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,Size);*/return (true);
}
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnChartEvent(constint id, // Event IDconstlong& lparam, // Parameter of type long eventconstdouble& dparam, // Parameter of type double eventconststring& sparam // Parameter of type string events
)
{
if(id==CHARTEVENT_CHART_CHANGE)
{
ClearMyObjects();
}
}
//+------------------------------------------------------------------+
CArrayObj - Коллекции данных - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Ничё не понял, но передавайте массив указателей CArrayObj на созданные в OnInit() объекты
Артем, спасибо за ответ. Прошу прощения за непонятный вопрос) В эксперте могут использоваться три глобальные переменные типа указатели на объект : var1, var2, var3.
До исполнения OnInit() неизвестно, все ли эти переменные будут нужны (это связано с таймфреймами), неизвестны также параметры для конструкторов, которые будут инициализировать объекты. Как создать такие переменные в OnInit(), чтобы они при этом были глобальными?
Артем, спасибо за ответ. Прошу прощение за непонятный вопрос) В эксперте могут использоваться три глобальные переменные типа указатели на объект : var1, var2, var3.
До исполнения OnInit() неизвестно, все ли эти переменные будут нужны (это связано с таймфремами), неизвестны также параметры для конструкторов, которые будут инициализировать объекты. Как создать такие переменные в OnInit(), чтобы они при этом были глобальными?
Я не знаю что у вас там за волшебный конструктор, в котором одни неизвестные :)
Объекты не нужно заранее объявлять как экземпляры.
Нужно объявить один массив CArrayObj. Сами ваши объекты должны быть наследниками CObject.
Создаёте ваш объект по new и добавляете указатель на него в список.
Создаёте следующий и добавляете в список, и т.д.
Уже этот список - указатель на него (а список объявлен глобально), передаёте в ваши конструкторы.
Но вот как вы собрались делать конструкторы с неизвестными заранее аргументами - тут я немного не понял. Попробуйте это пояснить
Конечно есть - всё что душенька желает. надо только в кодобазу заглядывать и тестировать все подряд эксперты, там точно есть - я всегда так и делаю почти всех экспертов пере тестировал.
Я думал его оставить, и добавить типа trailing buy/sell
Может у кого есть идея?
Eugen8519 Может у кого есть идея?
можно к примеру ещё такой трал добавить - а от объекта можно выполнить любую команду
https://www.mql5.com/ru/forum/233860/page43#comment_13219147
Всем привет!
Подскажите убогому, возможна ли синхронная работа МТ4 со смартфона и ПК на одном счете?
Так, что б выставлять ордера через смарт, а видеть и редактировать в ПК реалтайм??
Спасибо!
Всем привет!
Подскажите убогому, возможна ли синхронная работа МТ4 со смартфона и ПК на одном счете?
Так, что б выставлять ордера через смарт, а видеть и редактировать в ПК реалтайм??
Спасибо!
Здесь ветка по MQL5.
Ордера и позиции (MQL5) одинаково выставляются, модифицируются и закрываются хоть через ПК, хоть через смартфон, вручную, в реальном времени.
Помогите исправить индикатор, он не отображается в терминале MT5, при компиляции выдает ошибки.
Помогите исправить индикатор, он не отображается в терминале MT5, при компиляции выдает ошибки.
самое простое - в OnCalculate в самом начале всем массивам задать ArraySetAsSeries(Open,true) ; ArraySetAsSeries(Close,true) ; и так далее.
это традиционный сюрприз на ровном месте: в 5-ке направления индексации по умолчанию иное чем в 4-ке..
индикатор буферов не использует, просто строит граф.объекты - после запуска нажмите Ctrl+B и смотрите куда он их там поместил
Перекопал документацию и форум ...
Как сделать глобальными переменные типа указатель на объект [в примере var], если они создаются в OnInit() строкой:
CObj* var=new CObj(p1,p2,p3);причем количество объектов и параметры конструкторов заранее неизвестны и вычисляются в OnInit() ?
Перекопал документацию и форум ...
Как сделать глобальными переменные типа указатель на объект, если они создаются в OnInit():
причем количество объектов и параметры конструкторов заранее неизвестны и вычисляются в OnInit() ?
Ничё не понял, но передавайте массив указателей CArrayObj на созданные в OnInit() объекты
Ничё не понял, но передавайте массив указателей CArrayObj на созданные в OnInit() объекты
Артем, спасибо за ответ.
Прошу прощения за непонятный вопрос)
В эксперте могут использоваться три глобальные переменные типа указатели на объект : var1, var2, var3.
До исполнения OnInit() неизвестно, все ли эти переменные будут нужны (это связано с таймфреймами), неизвестны также параметры для конструкторов, которые будут инициализировать объекты.
Как создать такие переменные в OnInit(), чтобы они при этом были глобальными?
Артем, спасибо за ответ.
Прошу прощение за непонятный вопрос)
В эксперте могут использоваться три глобальные переменные типа указатели на объект : var1, var2, var3.
До исполнения OnInit() неизвестно, все ли эти переменные будут нужны (это связано с таймфремами), неизвестны также параметры для конструкторов, которые будут инициализировать объекты.
Как создать такие переменные в OnInit(), чтобы они при этом были глобальными?
Я не знаю что у вас там за волшебный конструктор, в котором одни неизвестные :)
Объекты не нужно заранее объявлять как экземпляры.
Нужно объявить один массив CArrayObj. Сами ваши объекты должны быть наследниками CObject.
Создаёте ваш объект по new и добавляете указатель на него в список.
Создаёте следующий и добавляете в список, и т.д.
Уже этот список - указатель на него (а список объявлен глобально), передаёте в ваши конструкторы.
Но вот как вы собрались делать конструкторы с неизвестными заранее аргументами - тут я немного не понял. Попробуйте это пояснить