Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#1901

Oll можно и так, но я сделал так,как сделал.все работает. Я то же сначала не понял,потом сделал переменные все стало работать.Спасибо за подсказку, из головы вылетело что OP_BUY и OP_SELL это константы, и они не меняются !

Изменено 13 февраля, 2015 пользователем denis77515

#1902

Благодарю Вас ув. Oll и Денис)))ошибки пропали)))
с ув.

#1903

Товарищи, подскажите начинающему )
В чужом советнике в самом верху прописал код для установки ММ. Ошибок нет. Но при тестировании при увеличении Депозита, позволяющего открывать больший лот, изменений не происходит. Лот открывает такой же, как и при начале тестов.
Подскажите, может нужно дописать какую то строчку, чтобы при открытии последующих сделок сов в первую очередь проверял это условие?
Или же советники с авто ММ вообще не тестируются?

double MM_Lot;
double Min_Lot;

int init() {
Min_Lot = MarketInfo(Symbol(), MODE_MINLOT);

if (MM == TRUE)
MM_Lot = MathFloor((AccountFreeMargin() - AccountCredit()) / Auto_MM) * Min_Lot;
else MM_Lot = BaseLotSize;
#1904
Rever27 функция инит отрабатывает 1 раз при запуске совы. если Вы хотите пересчитывать лот, то нужно расчёт лота делать непосредственно перед вызовом ОрдерСенд.
#1905


Rever27 функция инит отрабатывает 1 раз при запуске совы. если Вы хотите пересчитывать лот, то нужно расчёт лота делать непосредственно перед вызовом ОрдерСенд.



Поставил перед OrderSend - ничего не изменилось. Мм не меняется в зависимости от депозита.
воткнул в OrderSend - Мм заработал, но построение сетки у мартина слетело.
Возможно, авто мм не работает только в тесте, на реале будет иначе, буду разбираться.
#1906
Rever27 в случае с сеткой надо рассчитывать лот только на первом ордере, иначе действительно мартин работать не будет.
#1907
0ll Расчет то идет. И советник показывает будущий ордер в соответствии с ММ (рынок закрыт, сейчас не проверю на практике), но вот как тест или оптимизацию такой Мартышки сделать, ума не приложу )

Еще у меня есть такой вопрос, каверзный.
Что нужно прописать в индикаторе, чтобы ограничить количество одновременно торгуемых пар, скажем до 2-3. Как это представлено в Индикаторе от Советника FxHunter? Уж больше интересная функция
#1908
Rever27 тест и оптимизация должны работать без проблем. хоть с ММ хоть без.
По поводу Индикатора от Советника FxHunter - там идёт расчёт просадки по эквити и если она больше порога, то совы на других парах не открывают новых сеток. (ну насколько я понял)
#1909


Rever27 тест и оптимизация должны работать без проблем. хоть с ММ хоть без.
По поводу Индикатора от Советника FxHunter - там идёт расчёт просадки по эквити и если она больше порога, то совы на других парах не открывают новых сеток. (ну насколько я понял)



0ll по эквити, это да. Но там есть еще одна полезная функция - ограничивать количество торгуемых пар в одно время. т.е. если из 5 пар у нас уже 2 в рынке, то по всем остальным ставиться блок. Вот как такого написать для своего индикатора, ума не приложу ))
#1910
Rever27 вариантов много. например: у Вас сова с магиком=111 стоит на 5 парах.
В сове перед открытием сетки делаете перебор открытых ордеров по магику=111 и считаете разные символы (т.е. если текущего символа нет в строке, то symbCount++; и пишем символ в строку через ",", иначе пропускаем) по итогу подсчёта делаете вывод открывать или нет.
#1911
0ll В том то и проблема, что Маджики должны быть разные на всех парах. Для такого контроля нужна функция в отдельном индикаторе.
Понимаю, что пока мало в этом понимаю :d
Спасибо за советы, буду дальше учить "МатЧасть", по мере спрашивать :)
#1912


0ll В том то и проблема, что Маджики должны быть разные на всех парах.

Зачем?
#1913
0ll Так советник по Маджику проверяет открытые сделки, и не дает строить дополнительные сетки. Как же без маджика то иначе? ))
#1914

Обычно советники фильтруют открытые ордера по (символу и магику). если одна сова стоит на нескольких парах, то совсем не обязательно менять магики.
Даже если Вы создадите индюк, о котором мечтаете, то всё равно придётся вносить изменения в советник для взаимодействия с индюком и это будет не проще, чем реализовать простой подход, о котором я писал выше.
Ну тут Вам решать что делать... будут конкретные вопросы - задавайте.

#1915


Обычно советники фильтруют открытые ордера по (символу и магику). если одна сова стоит на нескольких парах, то совсем не обязательно менять магики.
Даже если Вы создадите индюк, о котором мечтаете, то всё равно придётся вносить изменения в советник для взаимодействия с индюком и это будет не проще, чем реализовать простой подход, о котором я писал выше.
Ну тут Вам решать что делать... будут конкретные вопросы - задавайте.



На самом деле, я бы выбрал и простой подход, но моих знаний не хватит даже на его реализацию )

int CountTrades()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic)
if (OrderSymbol() == Symbol(EURUSD) || OrderSymbol() == Symbol(GBPRUSD) //и т.д.
count++
}
else
Ticket = OrderSend(....
}
return(count);
}


Понимаю, что как то так я смогу выделить пары, которые сейчас в торговле, но мысль, как видно, в код я перевести не могу )
И в интернете подобного кода не нашел
#1916
Rever27 начал почти правильно. замечания:
1. ну формально, функция будет называться CountSymbol

//=========================== Вызывающий код (разрешено 2 символа):
if (orderCount //если на данный момент по текущему символу ордеров нет
{ OrderSend(..... }
else return;
//=================================================
int CountSymbol()
{
int count = 0;
string sss = "";
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (!OrderMagicNumber() == Magic) continue;
if (StringFind(sss, OrderType(), 0) {
sss += OrderType() + ",";
count++;
}
}
/* else
Ticket = OrderSend(.... //Это не здесь нужно а в вызывающем коде
*/
}
return(count);
}

как-то так...

Изменено 16 февраля, 2015 пользователем 0ll

#1917

Rever27, я как понимаю вам надо открыть две сделки по разным парам.не знаю на сколько это правильно,но себе я сделал так.

Спойлер

[

extern int Magic = 123;

int Size_usd;

string Array_usd[] = {"EURUSD","GBPUSD"};
//--------------------------------------------------------++
int OnInit()
{
Size_usd=ArraySize(Array_usd);
}
//----------------------------------------------------------++
void OnTick()
{
if(CountTrades(Magic,OP_SELL) == 0)
Open_Orders();
//---------
}
//----------------------------------------------------------++
void Open_Orders()
{
int i,a;
for(i=Size_usd-1; i>=0; i --)
{
string sym_usd = Array_usd;
OrderSend(sym_usd,OP_SELL,Lots,MarketInfo(sym_usd,MODE_BID),Slippage,0,0,"",Magic,0,clrRed);

}
}
//----------------------------------------------------------++
int CountTrades(int mn, int Otype)
{
int count = 0;
for(int i=OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if((OrderMagicNumber() == mn) && (OrderType() == Otype))
count++;
}
}
}

return(count);
}


]

Изменено 16 февраля, 2015 пользователем denis77515

#1918
denis77515 если коротко, то у Rever27 другая задача: ему нужно ограничить торговлю 10 одинаковым совам, стоящим на разных парах, 2 парами. т.е. те две совы, которые первыми открыли сделки, остаются в рынке и торгуют, а остальные - на забор.
Полезная штука однако...
#1919

ага понятно, значит я не понял.интересная задача.

#1920

Спасибо всем за содействие :), я по специальности Инженер, но не унываю понять и Программирование )
А функция действительно полезная для защиты депозита от высокой просадки, если сов мультивалютный.

В FxHunter'е она реализована именно в индикаторе, но не думаю, что разработчики поделятся кодом )

0ll код завтра попробую проверить.
Только вопрос, я правильно понял, что в

string sss = "";
нужно прописать все пары, что используются в торговле?
И
OrderSend(
нужно 2 раза писать?
При условии, что проверить работоспособность функции в тестере невозможно, то возможно ли создать alert для этого условия?
#1921
Rever27 ни в коем случае не применяйте код смысл которого не поняли!!!
Данная ветка "Обучение языку..." - вот и обучайтесь...
Посидите со справкой в едиторе и разберите каждую строчку - это Вам нужно!
На Ваши вопросы могу ответить - Вы поняли не правильно.
#1922

Как можно реализовать стратегию Лабушер? С помощью массива?

#1923


Как можно реализовать стратегию Лабушер? С помощью массива?

??? не все думают синхронно с Вами...
что за стратегия?
#1924

Изначально это стратегия для казино.
Есть заданный ряд чисел, сумма ставки равна сумме крайних чисел. При проигрыше сумма ставки добавляется к числовому ряду, при выигрыше крайние числа вычеркиваются. Когда все числа вычеркнуты, прибыль будет равна сумме чисел начального ряда.
Думаю можно сделать это с помощью массива. Только надо будет определять крайние числа. Не знаю как это сделать, может с помощью цикла?

#1925
FoxMongoose "крайние" это 2 последних? ну а между 1-ым и 2-ым числом разность какая? или они одинаковые?
если да, то это последовательность Фибоначчи. Можно реализовать и без массива.
Опишите чётко, чтоб вопросов не возникало, можно и с примером расчёта.

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

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