Х = минимальный обьём сделки
<code> extern bool DelStop = true; //удалять стоповые ордера </code>
<code> if(DelStop){ // если разрешено удаление стоповых ордеров if(CountOrders()<2) // и если отложенных ордеров меньше двух, DelOrder(); // тогда оставшийся удаляем. } else{ // иначе TrailingOrder(); // тралим оставшийся стоповый ордер за ценой } </code>
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountOrders()<2)//если отложенных ордеров меньше двух,
DelOrder(); // тогда оставшийся удаляем.
if(CountOrders(6)<1 )//если нет ни открытых позиций ни отложенных ордеров
{
PutOrder(4,Ask+Distance*_Point);//тогда выставляем байстоп
PutOrder(5,Bid-Distance*_Point);// и селлстоп ордераю
}
}
//+------------------------------------------------------------------+
if(countBuy_2+countSell_2>0) all_3=NormalizeDouble((allBuy_2 - allSell_2) / (countBuy_2 - countSell_2),_Digits);//Сибирь
//-------------------------------------------------------------------
extern string s_1 = " Закрывать дальнюю убыточную и положительные при достижении суммарного профита CloseProfit";
extern bool Close_1 = false;
enum tt
{
tr2=0, //по текущей валюте
tr1=1, //по всем символам
};
extern double CloseProfit = 10; // Закрывать по суммарному профиту в валюте;
input tt Symbоl = 1; // Суммируем профит
extern string s_2 = " Закрывать и удалять всё при достижении суммарного профита Profits или Loss";
extern bool Close_2 = false;
extern double Loss = 2000; // Loss убыток в валюте если 0 то не используется
extern double Profits = 0; // Profits профит в валюте 0 то не используется
extern string s_3 = " Закрывать 2 позиции с максимальным лотами при достижении суммарного профита profits или Los";
extern bool Close_3 = false;
extern double loss = 2000; // loss убыток в валюте если 0 то не используется
extern double profits = 0; // profits профит в валюте 0 то не используется
extern string s_4 = " Закрывать и удалять всё при открытии более чем N позиций и достижении суммарного профита рrof ";
extern bool Close_4 = false;
extern double prof = 10; // profits профит в валюте 0 то не используется
extern int N = 3; // Максимальное кол-во открытых позиций
extern string s_5 = " Закрывать нескольско последних позиций при открытии более чем Partpos позиций и достижении по ним суммарного профита Prof ";
extern bool Close_5 = false;
extern int Partpos = 3; // число поз после которого происходит для закрытия части позиций
extern double Prof = 10; // Prof профит части позиций в валюте для их последующего закрытия
extern string s_6 = " Параметры безубытка";
extern bool BU = false; // Использовать безубыток
extern int LevelProfit = 50; // Уровень профита БУ
extern string s_7 = " Параметры трала";
extern bool Trail = True; // Использовать трал . Тралить всё
extern bool BuyTrail = True; // Тралить покупки
extern int TStop_Buy = 50; // Размер трала в пунктах для покупок
extern bool SellTrail = True; // Тралить продажи
extern int TStop_Sell = 50; // Размер трала в пунктах для продаж
extern int TrailingStep = 30; // Шаг трала в пунктах
extern string s_8 = " Параметры StopLoss";
extern bool StopOne = false; // Использовать стоплосс для первой позиции
extern bool StopLoss = false; // Использовать стоплосс
extern double Kratnost = 2; // Коэф. кратности delta для расчета StopLoss
extern string s_9 = " Параметры трала средств";
extern bool Tral = false; // Использовать трал средств
extern int EqvTralStep= 80; // Шаг трала по Эквити счета в валюте депозита
extern string s_10 = "Внешние параметры советника";
extern double Lot = 0.01; // Стартовый лот
extern int delta = 150; // Расстояние до стоп ордера от крайней позиции
extern bool easy = true; // Использовать легкий вариант рассчета последующих лотов
extern int Slip = 30; // Проскальзывание
extern int Magic = 123; // Магик
extern bool ShowComment = True; // Показывать комментарий
<code> Я вам, кажется говорил, что не торгую. Поэтому так быстро проверить не могу эту зебру. Жду связи с автором, индикатор которого вы (если я правильно понял) даже не посмотрели на You Tube. Уточню — отпишусь, а пока… пребываю при своем мнении. Ошибки признавать умею. </code>
if(countBuy+countSell>0) all_2=NormalizeDouble((allBuy/countBuy + allSell/countSell) / (countBuy + countSell),_Digits);//Odessa
А на счет расчета, величины будут разные, ибо формулы разнятся. Что дальше то?
//+------------------------------------------------------------------+
//| Odessa.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.mункцql5.com"
#property version "1.00"
#property strict
extern int TrailingStop = 1000;
extern int Magic = 111; // магик
input color col = clrLime;
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectsDeleteAll();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--------------AM2
double all=0, all_1=0, all_2=0, all_3=0,count=0,sl=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2)
{
all+=OrderOpenPrice()*OrderLots();
count+=OrderLots();
}
}
}
}
if(count>0) all=NormalizeDouble(all/count,_Digits);// AM2
//--------------------------------------------------------------
//-----------------------Odessa
double allBuy=0,countBuy=0,allSell=0,countSell=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderType()==OP_BUY)
{
allBuy+=OrderOpenPrice();//здесь не хватает умножения на *OrderLots() в этом ошибка
countBuy+=OrderLots();
}
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderType()==OP_SELL)
{
allSell+=OrderOpenPrice();//здесь не хватает умножения на *OrderLots() в этом ошибка
countSell+=OrderLots();
}
if(countBuy+countSell>0) all_1=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);//Odessa
//-----------------------------------------------------------------------
//------------------------------Сибирь
double allBuy_2=0,countBuy_2=0,allSell_2=0,countSell_2=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderType()==OP_BUY)
{
allBuy_2+=OrderOpenPrice()*OrderLots();
countBuy_2+=OrderLots();
}
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderType()==OP_SELL)
{
allSell_2+=OrderOpenPrice()*OrderLots();
countSell_2+=OrderLots();
}
if(countBuy_2+countSell_2>0) all_2=NormalizeDouble((allBuy_2 + allSell_2) / (countBuy_2 + countSell_2),_Digits);//Сибирь
if(countBuy_2+countSell_2>0) all_3=NormalizeDouble((allBuy_2 - allSell_2) / (countBuy_2 - countSell_2),_Digits);//Сибирь
//-------------------------------------------------------------------
DrawLABEL("AM2",StringConcatenate(count," лотов. БУ AM2 = ",DoubleToStr(all,_Digits)),135,70,col,ANCHOR_LEFT);
DrawLABEL("Odessa",StringConcatenate(countBuy+countSell," лотов. БУ Odessa = ",DoubleToStr(all_1,_Digits)),135,90,col,ANCHOR_LEFT);
DrawLABEL("Сибирь1",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь сложение = ",DoubleToStr(all_2,_Digits)),135,110,col,ANCHOR_LEFT);
DrawLABEL("Сибирь2",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь вычитание = ",DoubleToStr(all_3,_Digits)),135,130,col,ANCHOR_LEFT);
}
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
if (P) return(a);
else return(b);
}
//------------------------------------------------------------------
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
if (ObjectFind(name)==-1)
{
ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
ObjectSet(name, OBJPROP_CORNER, 2);
ObjectSet(name, OBJPROP_XDISTANCE, X);
ObjectSet(name, OBJPROP_YDISTANCE, Y);
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
ObjectSetInteger(0,name,OBJPROP_ANCHOR,align);
}
ObjectSetText(name,Name,12,"Arial",clr);
}
//--------------------------------------------------------------------
<code> //+------------------------------------------------------------------+ //| Odessa.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.mункцql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.mункцql5.com" #property version "1.00" #property strict extern int TrailingStop = 1000; extern int Magic = 111; // магик input color col = clrLime; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- ObjectsDeleteAll(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // bool mod; double all=0, all_1=0,count=0,sl=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()<2) { all+=OrderOpenPrice()*OrderLots(); count+=OrderLots(); } } } } if(count>0) all=NormalizeDouble(all/count,_Digits); double allBuy=0,countBuy=0,allSell=0,countSell=0; for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) if(OrderType()==OP_BUY) { allBuy+=OrderOpenPrice(); countBuy+=OrderLots(); } for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) if(OrderType()==OP_SELL) { allSell+=OrderOpenPrice(); countSell+=OrderLots(); } if(countBuy+countSell>0) all_1=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits); /* for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(Bid-all_1>TrailingStop*_Point) { if(OrderStopLoss()<Bid-TrailingStop*_Point) { sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits); if(OrderStopLoss()!=sl) mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow); } } } if(OrderType()==OP_SELL) { if(all_1-Ask>TrailingStop*_Point) { if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0)) { sl=NormalizeDouble(Bid+TrailingStop*_Point,_Digits); if(OrderStopLoss()!=sl) mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow); } } } } } }*/ DrawLABEL("AM2",StringConcatenate(count," лотов. БУ AM2 = ",DoubleToStr(all,5)),135,70,col,ANCHOR_LEFT); DrawLABEL("Odessa",StringConcatenate(countBuy+countSell," лотов. БУ Odessa = ",DoubleToStr(all_1,5)),135,90,col,ANCHOR_LEFT); } //+------------------------------------------------------------------+ color Color(bool P,color a,color b) { if (P) return(a); else return(b); } //------------------------------------------------------------------ void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT) { if (ObjectFind(name)==-1) { ObjectCreate(name, OBJ_LABEL, 0, 0, 0); ObjectSet(name, OBJPROP_CORNER, 2); ObjectSet(name, OBJPROP_XDISTANCE, X); ObjectSet(name, OBJPROP_YDISTANCE, Y); ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false); ObjectSetInteger(0,name,OBJPROP_SELECTED,false); ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); } ObjectSetText(name,Name,12,"Arial",clr); } //-------------------------------------------------------------------- </code>
//ModifyOrders();
У каждого свои методы торговли и свои стратегии. Наверное и Ваш метод имеет право на жизнь.
Но я предпочитаю «отталкиваться» от графика самой цены, а не от её производной первого порядка (скользящая средняя и т.д.), и уж тем более второго порядка как у Вас в том советнике (индикатор от индикатора). Хотя признаю, что без индикаторов не обойтись, в конце концов график цены — это тоже индикатор.
Пост не для спора, просто высказал своё мнение.
ssg