#1254

Немного смущает сам вопрос - при сетке более 8 ордеров становится неправильным расчёт БУ (в обоих случаях)? или косяк в дальнейшем расчёте ТП, или при модификации ордера? как Вы узнали о неправильном ТП у ордеров?


Например, при дефолтных настройках выложенного советника ТП -50пп (4-х знак). Т.е. при лоте=0.1(усреднение), средняя доходность составляет ордера в сетке 50$. А, например, на сетке в 23 ордера средняя доходность 38$.
На кроссах при 8 ордерах вообще отрицательная :(
При этом в визуальном режиме отображается линия БУ и "линейкой" измеряю- ТП стоит там где надо- на расстоянии 50 пп. Собственно поэтому стал грешить на расчет цены БУ.

bag.png

#1255

Ок. Давай разберём конкретный пример на 23 ордера. Скинь сюда лотности и цены открытия, а мы пересчитаем и сравним.

#1256

24 ордер не считаем, он одиночный, далее с 1 по 23 в сумме дали 892$ :23= 38,8$ на ордер

StrategyTesterBag.gif
StrategyTesterBag.htm5 скач.

#1257

Посмотрите 12 ордер. У него тейк был 515 пипс, а в деньгах около 43$, что явно меньше ожидаемых Вами 50$... Может тут собака порылась?
А сова считает всё правильно...
Можно рассчитывать ТП не в пунктах а в деньгах. 23 * 50$ = 1150$ вот ожидаемый тейк, делите на цену пункта = будет тейк в пипсах.

#1258

Короче, я совсем ничего не понимаю... Сделал, как Oll рекомендовал:
Выкинул всю сетку в Эксель... Выводы:
1. дистанция между ордерами как положено- 100 пп. (4-х знак);
2. Тейк в пунктах- 1149, что в среднем по 50 пп на каждый ордер- как положено.
3. Цена пункта в середине сетки (11,12,13 ордера) отклоняется от правильного (=1$), далее снова приходит в норму..
4. Из-за изменения стоимости пункта "плывет" общая прибыль (-892$) и, соответственно, средняя прибыль на ордер (=39$).
Полтергейст?! ~x(
All, Вы, по-моему, делали из Ва-банка сеточник (хотя без разницы по какой стратегии). Может покажете в качестве образца?

Расчет_рез._сетки.png
Сетка23ордера.xlsx4 скач.

#1259

Из Ва-банка не делал, из доступных делал zerg, модифицировал Илан. А для себя делал в классах, т.е. работа с ордерами в одном классе, работа с сеткой в другом, ММ в третьем, индикаторы в четвёртом, а сама стратегия в основном файле. Довольно сложно всё выписано - если долго не смотрю в код, то сам путаюсь. Загляни в код сетки QJ - что-то похожее... Классы публиковать не буду - на любые вопросы отвечу.

#1260

Короче, нашел, в чем проблема: все-таки учет свопов (вернее, его отсутствие) вносил искажение в результаты. Т.к. сетка могла висеть много дней, это оказалось существенным моментом. Сразу не "дошел" до этого потому что при включенном ежедневном пересчете ТП результат также был неверен. Просто фактически пересчет не производился...
И вот теперь я "залип" на куске кода, отвечающий за пересчет...


datetime dtDay=0;
if( UseCalcSwap && dtDay!=iTime(NULL, PERIOD_D1, 0) )
{
dtDay=iTime(NULL,PERIOD_D1,0);
Print("Пересчитываем ТП раз в день");
if (countBUY>0) { SetTakeProfit(OP_BUY, false) ; Print("Пересчитан ТП БАЙ-сетки.Новый день или Стоп-ордер переведен в рыночный"); }
if (countSELL>0){ SetTakeProfit(OP_SELL, false) ; Print("Пересчитан ТП СЕЛЛ-сетки.Новый день или Стоп-ордер переведен в рыночный");}
}

Блин, ну проще быть не может, НО! iTime выдает корректное время только для текущего ТФ, для W1 и для MN1.(в тестре)
Весь Гугл перерыл, никто об этой проблеме не упоминал.
Специально написал:
void OnTick()
{
//---
Print("Current TF ", Period());
Print("M1 ", iTime(NULL,PERIOD_M1,0));
Print("M5 ", iTime(NULL,PERIOD_M5,0));
Print("M15 ", iTime(NULL,PERIOD_M15,0));
Print("M30 ", iTime(NULL,PERIOD_M30,0));
Print("H1 ", iTime(NULL,PERIOD_H1,0));
Print("H4 ", iTime(NULL,PERIOD_H4,0));
Print("D1 ", iTime(NULL,PERIOD_D1,0));
Print("W1 ", iTime(NULL,PERIOD_W1,0));
Print("MN1 ", iTime(NULL,PERIOD_MN1,0));
Print("==============================");
}

Результат, например, для Н1:
2010.01.01 00:00:00  test_iTime test started
2010.01.01 02:00:03 test_iTime EURUSDf,H1: Current TF 60
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M1 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M5 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M15 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M30 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: H1 2010.01.01 02:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: H4 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: D1 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: W1 2009.12.27 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: MN1 2010.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: =======================

Нулевые результаты для некоторых ТФ остаются таковыми на всем протяжении теста. Котировки закачаны все. Пробовал на разных инструментах...
В чем может быть проблема?
п.с. на ДЕМО работает как надо, проблема только в тестере...

Изменено 17 июля, 2017 пользователем usver73

#1261
usver73 Про проблемы с iTime я писал последний раз года полтора назад, в итоге когда Ва-Банк делал всё пересчитывал на текущий ТФ.
#1262

Вот мне тоже казалось, что читал про проблемы, но ветка большая, поленился искать...
Поставил "костыль" в виде TimeDayOfYear(TimeCurrent()), но глобально проблему он не решает- у меня есть еще разные штуки завязанные не фиксированный ТФ.

Цитата

в итоге когда Ва-Банк делал всё пересчитывал на текущий ТФ.

А можно в двух словах алгоритм или кусок кода?
Снимаю вопрос, нашел Вашу дискуссию с voldemar227.

Изменено 17 июля, 2017 пользователем usver73

#1263

Снимаю вопрос, нашел Вашу дискуссию с voldemar227.


Oll, уточнить хочу: в упомянутом обсуждении я взял Вашу проверку открытия нового бара на старшем ТФ:
 if (MathMod(Time[0], NewBar*60 ) == 0 ) 
Но если в if не включать проверку открытия бара на текущем ТФ, то в результате сигнал появляется несколько раз. Например, на рабочем ТФ М15 проверка бара на Н1 дает результат 4 раза... я сделал так:
if (MathMod((double)Time[0], TFEQ*60 ) == 0 && prevtimeEQ!=Time[0])
{
prevtimeEQ=Time[0];
....
}
Я не перемудрил?
И основной вопрос: применяю iLowest для поиска экстремумов на старшем ТФ. Выдает ошибку 4074 "Не хватает памяти для исторических данных". Скажите, с этой функцией тоже надо костыли применять?
#1264

по идее (для твоего примера) MathMod(Time[0], PERIOD_H1*60 ) = 0 только 1 раз в час и дополнительных костылей не нужно.
при использовании iLowest никогда никаких ошибок не видел, правда всегда использовал на текущем ТФ, если надо на старшем, то пересчитай длину фрейма и смотри на текущем и всё.
ПС: я никогда не использую другие ТФ - просто не вижу в этом смысла.

#1265

по идее (для твоего примера) MathMod(Time[0], PERIOD_H1*60 ) = 0 только 1 раз в час и дополнительных костылей не нужно


Ну не знаю, без костылей у меня не получилось. Допустим, рабочий ТФ М5, тогда Time[0] будет иметь одно и то же значение в течение 5 мин. и заходить в блок if несколько раз.

если надо на старшем, то пересчитай длину фрейма и смотри на текущем и всё.

так и сделал.

я никогда не использую другие ТФ - просто не вижу в этом смысла.

У меня трал по теням свечей на Н1. И Х.З., какой у пользователя в этот момент будет рабочий таймфрейм.
#1266

Допустим, рабочий ТФ М5, тогда Time[0] будет иметь одно и то же значение в течение 5 мин. и заходить в блок if несколько раз.

Ну сделай стандартную проверку новой свечи на текущем ТФ, можно туда и проверку индюков всунуть чтоб терминал не грузить.
#1267

Привет Гуру!

Помогите пожалуйста допилить советника. В тырнете нашел фрагмент кода по дням TIME FILTER, попробовал прикрутить - вроде получилось, но советник все равно открывает по времени, которое контролирует функция IsTradeTimeA(), а она открывает ордера с понедельника по пятницу. Необходим только TIME FILTER.

Код.txt4 скач.

Изменено 1 августа, 2017 пользователем mrJack

#1268

Вот код выключающий торговлю в определённые дни недели и числа месяца.
советнике пишите:
if ( NoTradeDay() ) return; // если не рабочий день - выход.
---------------
input string s_NoTradeDay_Month = "2,5,8,24";
input string s_NoTradeDay_Week = "3,5";

bool NoTradeDay()
{
string stm = IntegerToString( TimeDay( TimeCurrent() ) );
int pos = StringFind( s_NoTradeDay_Month, stm, 0 );
if ( pos >= 0 ) // найдено нерабочее число месяца
{
if ( StringLen( stm ) > 1 ) return ( true ); // если 2 значное число - выход
// если 1 значное число и т.к. будут 2 значные числа - проверка на "," или конец строки
if ( pos >= StringLen( s_NoTradeDay_Month ) - 1 ) return ( true ); // 1-зн.число и конец строки - выход
stm = StringSubstr( s_NoTradeDay_Month, pos+1, 1 );
if ( StringCompare( stm, "," ) == 0 ) return ( true ); // 1-зн.число и символ разделитель "," - выход
}

stm = IntegerToString( TimeDayOfWeek( TimeCurrent() ) );
if ( StringFind( s_NoTradeDay_Week, stm, 0 ) >= 0 ) return ( true ); // найден нерабочий день недели
return ( false );
}
----------------------

ПС: код не использую - тестируй тщательнее.

#1269

Спасибо! Вставлял и в начало кода после объявления переменных и ниже функции IsTradeTime - всё равно открывает в первых числах месяца 1,2,3,4,5. Не работает. Может не туда вставляю?

З.Ы. А эта фукция где должна быть прописана if ( NoTradeDay() ) return; // если не рабочий день - выход.. И с ней и без нее не работает. Я вставлял ее в тело функции IsTradeTime - тоже никакой реакции.

Код.txt4 скач.

Изменено 2 августа, 2017 пользователем mrJack

#1270

Почему с расширением txt, а не mq4?

   if ( StringFind( s_NoTradeDay_Week, stm, 0 ) >= 0 ) return ( true ); // найден нерабочий день недели      return ( false );   
Тут return(false); попал в комментарии.

В начало функции IsTradeTime вставить
if ( NoTradeDay() ) return(false);
#1271

Перезалил


Добавлено: 02-08-2017 11:18:40

Все исправил. Теперь свойства эксперта не открывается и не запускается на старт.

скачайте пожалуйста еще раз

Добавлено: 02-08-2017 11:29:52

Всех участников от души благодарю! Нашел ошибку и 3 раза перезапустил советника и все пошло!!! <:-p>EURCHF_M15.mq411 скач.

Изменено 2 августа, 2017 пользователем mrJack

#1273


Здравствуйте. Есть индикатор от советника Август Голем. Ломанный соаетник перестал работать. Помогите написать советник. Входы по сигналу. ПО одному сигналу на бар. При повторе сигнала, если идем не в нашу сторону так же открываем ордера. В общем делаем сетку, которую закрываем по обратному сигналу или по Общему ТП. ТФ 1 минута.
Можно вообще в советнике /sovetniki-foreks/11/sovetnik-martingeyl-survivor/15463/
заменить параметры входа на входы по прилагаемому индикатору, ну или добавить.
Сами сигналы появляются только пр прогоне в тестере. Нет стрелочек, только рисует какие-то кружочки.




На графике и в тестере рисует только скользящую и требует Вторую часть индюка AugustForexGolem_v2-i2.ex4.

Изменено 5 декабря, 2017 пользователем Pavel888

#1274


Помогите кто нить скомпилировать этот код в советник, я полный дуб в этом #:-s .
Сова имеет функцию нужную для моей стратегии обрезать часть прибыли (объема) . Нашел похожий код.
А так мне надо чтобы после определенного количества пунктов обрезалась позиция.
И чтобы сова могла обрезать сделки по всем открытым парам.
Функция в сове вроде такая " close_lot=NormalizeDouble(OrderLots()/2,2);
"2" это закрыть половину, округление согласно NormalizeDouble "+

Спойлер

extern string    General_settings        ="-------------------------------------------------------";

extern double Lots = 0.01;

extern int Delta = 1;

extern string Order_settings ="-------Настройки СЛ и ТП-------------------------------";

extern int TakeProfit = 500;

extern int StopLoss = 400;

extern string Order_management ="-------Настройки Риск Менеджмента----------------------";

extern bool fixed_sl=true;

extern int NoLoss = 100;

extern int NoLossFiboLevels = 60;

extern int NoLossProfit = 0;

extern string st5 ="-Настройки Дистанции и Процента для закрытия-----------";

extern bool Lot_Mode_Percent = true;

extern int Lot_Percent_23_6 = 5;

extern int Lot_Percent_38_2 = 20;

extern int Lot_Percent_50 = 30;

extern int Lot_Percent_61_8 = 40;

extern string st6 ="-Веремя работы советника------------------------------";

extern int TimeStart = 01; // Время начала работы советника

extern int TimeEnd = 23; // Время окончания работы советника

extern int TimeStartMonday = 3; // Время начало торговли в понидельник

extern int TimeEndFriday = 17; // Время после которого не торгуем в пятницу

// Глобальные переменные

int LastTradeTimeBuy = 0; // Время последней открытой сделки

int LastTradeTimeSell = 0;

int LastTradeBuy = 0; // Время последней открытой сделки

int LastTradeSell = 0; // Время последней открытой сделки

int MagicNumber= 0;

double StopLossValue = 0;

#define HR2400 86400 // 24 * 3600

int TimeOfDay(datetime when){ return( when % HR2400 ); }

datetime DateOfDay(datetime when){ return( when - TimeOfDay(when) ); }

datetime Today(){ return(DateOfDay( TimeCurrent() )); }

datetime Tomorrow(){ return(Today() + HR2400); }

datetime Yesterday(){ return( iTime(NULL, PERIOD_D1, 1) ); }

int tomorrow_day =0;

int current_day = 0;

int count_buy = 0;

int count_sell = 0;

//------- Внешние параметры модуля -----------------------------------

extern string _Parameters_b_Lot = "- Параметры модуля расчёта лота----------------------";

extern int LotsWayChoice = 1; // Способ выбора рабочего лота:

// 0-фиксированный,

// 1-процент от депозита,

// 2-фиксированно-пропорциональный,

// 3-фракционно-фиксированный,

extern int LotsPercent = 10; // Процент от депозита

extern int LotsDeltaDepo = 500; // Коэффициент приращения депозита

extern int LotsDepoForOne = 500; // Размер депозита для одного минилота

extern int LotsMax = 1000; // Максимальное количество минилотов

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

double fPreviousBid = 0; // значение bid на предыдущем тике

string symb;

int OnInit()

{

fPreviousBid = 0;

return(INIT_SUCCEEDED);

}



void OnTick()

{

symb = _Symbol;



Bkl();

}





void Bkl()

{



static datetime bodCurr; datetime bodPrev = bodCurr; bodCurr = DateOfDay( TimeCurrent() );

bool isNewDay = bodPrev != bodCurr;

if(isNewDay){

int part_order_close_sell_23_6 = 0;

};



if (TradeStatuse() > 0) return (0);

double SL=0,TP=0,NoLossTP=0,Current_Value,Bid_Value_23_6=0,Ask_Value_23_6=0,Bid_Value_38_2=0,Ask_Value_38_2=0,Bid_Value_50=0,Ask_Value_50=0,Bid_Value_61_8=0,Ask_Value_61_8=0,

Lot_23_6=0,

Lot_38_2=0,

Lot_50=0,

Lot_61_8=0,

Spread=Ask-Bid,

StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL),

HighD1=iHigh(Symbol(),PERIOD_D1,1),

LowD1=iLow(Symbol(),PERIOD_D1,1),

HighD1Today=iHigh(Symbol(),PERIOD_D1,0),

LowD1Today=iLow(Symbol(),PERIOD_D1,0),

HighH4=iHigh(Symbol(),PERIOD_H4,1),

LowH4=iLow(Symbol(),PERIOD_H4,1),

HighH6=iHigh(Symbol(),PERIOD_H6,0),

LowH6=iLow(Symbol(),PERIOD_H6,0),

HighW1=iHigh(Symbol(),PERIOD_W1,1),

LowW1=iLow(Symbol(),PERIOD_W1,1),

CheckHiLivels = 0, CheckLowLivels = 0;



static double max_23_6 = 0;

static double max_38_2 = 0;

static double max_50_0 = 0;

static double max_61_8 = 0;



static double min_23_6 = 0;

static double min_38_2 = 0;

static double min_50_0 = 0;

static double min_61_8 = 0;

static double high_day = 0;

static double low_day = 0;

high_day = iHigh(Symbol(), PERIOD_D1, 1);

low_day = iLow(Symbol(), PERIOD_D1, 1);

int total = OrdersTotal(); // сколько всего ордеров открыто

double fUpperLevel = iHigh(Symbol(), PERIOD_D1, 1) + Delta * Point();

double fLowerLevel = iLow(Symbol(), PERIOD_D1, 1) - Delta * Point();

double TodayHi = iHigh(Symbol(),PERIOD_D1,0); // Цена закрытия предпоследнего дня

double TodayLow = iLow(Symbol(),PERIOD_D1,0); // Цена закрытия последнего дня

if (TodayHi>fUpperLevel && Open[0]
if (TodayLow fLowerLevel) CheckLowLivels = 1;

bool Open_Bay = fPreviousBid > 0 && Bid > fUpperLevel && fPreviousBid
bool Open_Sell = fPreviousBid > 0 && Bid = fLowerLevel && CheckLowLivels == 1;

// запоминаем текущий бид

fPreviousBid = Bid;

int Ticket,cnt,Total=0;



double spread=ask-bid;

int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT));

comm=comm+"Вычисленный спред = "+(string)spread_points+" пунктов";

for(cnt=0;cnt
{

OrderSelect(cnt,SELECT_BY_POS);

if(OrderSymbol()==Symbol())

{

Total++;

Lot_23_6 = OrderLots()*Lot_Percent_23_6/100;if(Lot_23_6>OrderLots()||Lot_23_6100)Lot_23_6=100;}

Lot_23_6 = (NormalizeLot(Lot_23_6, False));

Lot_38_2 = OrderLots()*Lot_Percent_38_2/100;if(Lot_38_2>OrderLots()||Lot_38_2100)Lot_38_2=100;}

Lot_38_2 = (NormalizeLot(Lot_38_2, False));

Lot_50 = OrderLots()*Lot_Percent_50/100;if(Lot_50>OrderLots()||Lot_50100)Lot_50=100;}

Lot_50 = (NormalizeLot(Lot_50, False));

Lot_61_8 = OrderLots()*Lot_Percent_61_8/100;if(Lot_61_8>OrderLots()||Lot_61_8100)Lot_61_8=100;}

Lot_61_8 = (NormalizeLot(Lot_61_8, False));





if(OrderType()==OP_BUY)// long position is opened

{

max_23_6 = high_day + (MathAbs(high_day - low_day) / 4.236);

max_38_2 = high_day + (MathAbs(high_day - low_day) / 2.582);

max_50_0 = high_day + (MathAbs(high_day - low_day) / 1.960);

max_61_8 = high_day + (MathAbs(high_day - low_day) / 1.618);



if(Lot_38_2>0&& Bid> max_38_2)

{

if(Lot_38_2>0){

Print ("Частичное закрытие ордера Buy на уровне 32.2");

OrderClose(OrderTicket(), Lot_38_2, Bid, 20, Blue);return(0);}

return(0);

}

if(Lot_50>0&&Bid > max_50_0)

{

if(Lot_50>0){

Print ("Частичное закрытие ордера Buy на уровне 50");

OrderClose(OrderTicket(), Lot_50, Bid, 20, Blue);return(0);}



return(0);

}

if(Lot_61_8>0&&Bid > max_61_8)

{

if(Lot_61_8 > 0){

Print ("Частичное закрытие ордера Buy на уровне 61.8", Lot_61_8);

OrderClose(OrderTicket(), Lot_61_8, Bid, 20, Blue);return(0);}

return(0);

}



if( Bid > OrderOpenPrice()+(NoLoss*Point) && NoLoss>0 )

{

SL = NormalizeDouble(OrderOpenPrice()+(NoLoss*Point),Digits);

if(!CompareDoubles(OrderStopLoss(),SL)){

OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);

}

return(0);

}

if( Bid > max_23_6 && OrderStopLoss()
{

SL = NormalizeDouble(OrderOpenPrice() + (NoLossFiboLevels*Point),Digits);

if (!CompareDoubles(OrderStopLoss(),SL)){

OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue);

Print ("Частичное закрытие ордера Buy на уровне 23.6");

OrderClose(OrderTicket(), Lot_23_6, Bid, 20, Blue);return(0);

}



}





}

if(OrderType()==OP_SELL)

{



//--sell---------------------------------------------------------------------------------------------------------------------

min_23_6 = low_day - (MathAbs(high_day - low_day) / 4.236);// Alert("min_23_6 ", min_23_6);

min_38_2 = low_day - (MathAbs(high_day - low_day) / 2.582);

min_50_0 = low_day - (MathAbs(high_day - low_day) / 1.960);

min_61_8 = low_day - (MathAbs(high_day - low_day) / 1.618);// Alert("min_61_8 ", min_61_8);





if(Lot_38_2>0&&Ask
{

if(Lot_38_2>0){

Print ("Частичное закрытие ордера Sell на уровне -38.2 ",Ask," Размер лота ",Lot_38_2);

OrderClose(OrderTicket(), Lot_38_2, Ask, 20, Blue);return(0);}



}

if(Lot_50>0&&Ask
{

if(Lot_50>0){

Print ("Частичное закрытие ордера Sell на уровне -50 ",Ask," Размер лота ",Lot_50);

OrderClose(OrderTicket(), Lot_50, Ask, 20, Blue);return(0);}



}

if(Lot_61_8>0&& Ask
{

if(Lot_61_8>0){

Print ("Частичное закрытие ордера Sell на уровне -61.8 ",Ask," Размер лота ",Lot_61_8);

OrderClose(OrderTicket(), Lot_61_8, Ask, 20, Blue);return(0);}



}

if( Ask 0 )

{

SL = NormalizeDouble(OrderOpenPrice() - (NoLoss*Point),Digits);

if (!CompareDoubles(OrderStopLoss(),SL)){

OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue);

}



return(0);

}

if( Ask min_23_6 )

{

SL = NormalizeDouble(OrderOpenPrice() - (NoLossFiboLevels*Point),Digits);

if (!CompareDoubles(OrderStopLoss(),SL)){

OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue);

Print ("Частичное закрытие ордера Sell на уровне -23.6 ",Ask," Размер лота ", Lot_23_6);

OrderClose(OrderTicket(), Lot_23_6, MarketInfo(Symbol(), MODE_ASK), 20, Blue);

}



}



}

}

}

//+----Открытие позиций

int TradeTime=TimeDay(TimeCurrent());

int TradeTimeBuy=TimeDay(TimeCurrent());

int TradeTimeSell=TimeDay(TimeCurrent());

if(Total
{

if(Open_Bay && LastTradeTimeBuy!=TradeTimeBuy )

{

SL = iLow(symb,PERIOD_D1,0);

// Alert("(Bid-SL)*10000 ", (Bid-SL)*100000);

if((Bid-SL)*100000>StopLoss){SL = Bid - (StopLoss*Point);}

if(TakeProfit>0) TP = Ask + TakeProfit*Point;

if(Bid-SL
Ticket=OrderSend(Symbol(),OP_BUY,GetSizeLot(),Ask + Spread ,20,SL,TP);

if (Ticket > 0)

{

LastTradeTimeBuy=TradeTimeBuy; // задаем время сделки, чтобы сегодня больше не торговать

}

return(0);

}

//+----

if(Open_Sell && LastTradeTimeSell!=TradeTimeSell)

{

SL = iHigh(symb,PERIOD_D1,0);

if((Ask+SL)*100000>StopLoss){SL = Ask + (StopLoss*Point);}

if(TakeProfit>0) TP = Bid - TakeProfit*Point;

if (SL-Ask
Ticket = OrderSend(Symbol(),OP_SELL,GetSizeLot(),Bid - Spread,20,SL,TP);

if (Ticket > 0)

{

LastTradeTimeSell=TradeTimeSell; // задаем время сделки, чтобы сегодня больше не торговать

}

return(0);

}

}

// return(0);

}

int TradeStatuse()

{

if ((!IsTesting()) && IsStopped()) return (1); //--- Если не тестовый режим и советник приостановлен (IsStopped).

if ((!IsTesting()) && !IsTradeAllowed()) return (2); //--- Если не тестовый режим и торговля заблокирована (IsTradeAllowed).

if ((!IsTesting()) && IsTradeContextBusy()) return (3); //--- Если не тестовый режим и поток для выполнения торговых операции занят (IsTradeContextBusy).

if (Hour()
if (Hour() >= TimeEndFriday + DayOfWeek() == 5) return (5); //--- Проверка на торговое время в пятницу.

if (TimeEnd
{

if(Hour() >= TimeEnd && Hour()
}

else

{

if ((Hour() = TimeEnd)) return (6); //--- Проверка на торговое время.

}

if ((DayOfWeek() == 0) || (DayOfWeek() == 6)) return (7); //--- Выходные, некоторые брокеры как RVD торговля начинаеться в воскресение вечером

//---

return(0);

}

double GetSizeLot()

{

double dLot;

if (LotsWayChoice==0) dLot=Lots;

// фиксированный процент от депозита

if (LotsWayChoice==1)

{

// dLot=MathCeil(AccountFreeMargin()/10000*LotsPercent)/10;

dLot=MathFloor(AccountFreeMargin()/MarketInfo(Symbol(),MODE_LOTSIZE)/MarketInfo(Symbol(),MODE_MINLOT)*AccountLeverage()/100.0*LotsPercent) * MarketInfo(Symbol(),MODE_MINLOT);

}

// фиксированно-пропорциональный

if (LotsWayChoice==2)

{

int k=LotsDepoForOne;

for (double i=2; i
{

k=k+i*LotsDeltaDepo;

if (k>AccountFreeMargin())

{

dLot=(i-1)/10000; break;

}

}

}

// фракционно-фиксированный

if (LotsWayChoice==3)

{

dLot=MathCeil((AccountFreeMargin()-LotsDepoForOne)/LotsDeltaDepo)/10;

}

if (dLot
if (dLot>100) dLot=100;

return(dLot);

}





double NormalizeLot(double lo, bool ro=False, string sy="") {

double l, k;

if (sy=="" || sy=="0") sy=Symbol();

double ls=MarketInfo(sy, MODE_LOTSTEP);

double ml=MarketInfo(sy, MODE_MINLOT);

double mx=MarketInfo(sy, MODE_MAXLOT);

if (ml==0) ml=0.01;

if (mx==0) mx=100;

if (ls>0) k=1/ls; else k=1/ml;

if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

if (l
if (l>mx) l=mx;

return(l);

}



bool CompareDoubles(double number1,double number2)

{

if(NormalizeDouble(number1-number2,8)==0) return(true);

else return(false);

}

void NoLoss() {

int tip,Ticket;

double StLo,OSL,OOP;

for (int i=0; i
if (OrderSelect(i, SELECT_BY_POS)) {

tip = OrderType();

if (tip
OSL = NormalizeDouble(OrderStopLoss(),Digits);

OOP = NormalizeDouble(OrderOpenPrice(),Digits);

Ticket = OrderTicket();

if (tip==OP_BUY) {

if (OSL>OOP) continue;

StLo = NormalizeDouble(OOP+Point,Digits);

if (NormalizeDouble((Bid-OOP)/Point,0)>=NoLoss) {

if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))

Print("NoLoss Error ",GetLastError()," buy SL ",OSL,"->",StLo);

}

}

if (tip==OP_SELL) {

if (OSL
StLo = NormalizeDouble(OOP-Point,Digits);

if (NormalizeDouble((OOP-Ask)/Point,0)>=NoLoss) {

if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))

Print("NoLoss Error ",GetLastError()," sell SL ",OSL,"->",StLo);

}

}

}

}

}

} :((





Привет! Чаво от куда, куды вставлять? :-b

Изменено 5 декабря, 2017 пользователем Pavel888

#1275

Может кто модифицировать советник AP3.0 индикатором EasyTrend?
Смысл такой:
При торговле на м5 советником АР ордера открываются только по тренду из индикатора EasyTrend на тф h1, при смене тренда должны пред идущие ордера закрываться и открываться по новому тренду.
К сожалению исходного кода индюка нет, возможно ли осуществить эту задумку или нет?

Auto-Profit3.0.mq416 скач.
EasyTrend.ex413 скач.

#1276

Советник работает на мартингейле от границ канала в сторону тренда по стратегии Безубыток. Первый ордер рыночный, последующие отложенные. Нужно прикрутить закрытие ордеров по общему профиту и нормализовать работу. Такой вопрос-будут ли сделки закрываться по профиту, если сам профит на графике не выставляется?

Изменено 1 сентября, 2017 пользователем Schkiperok

#1277

Приветствую!!индикатор(SuperTrend)можно ли его использовать в советнике если можно
то как.советник(STrend_2)с 2я Moving Average работает нормально.Что добавить в код
чтоб использовать инди(SuperTrend)условия входа в скрине.Спасибо

Форум.rar24 скач.

#1278

Такой вопрос-будут ли сделки закрываться по профиту, если сам профит на графике не выставляется?

Вопрос не понятен. Если советник работает с неким набором ордеров, то он может контролировать их общий профит и даже с учётом комиссий и свопов, и закрывать свои ордера при достижении профитом некого уровня.

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025