Ваши вопросы по языку MQL4

hoz

Активный участник
Вроде как всё уже уложилось с большего, но вот вопрос:

PHP:
void fRun_Sort (int& fia_INDEX[],     // массив индексов
                double fda_Value[])   // массив значений
{
    int li_IND, li_int, li_tmp, li_size = ArraySize (fda_Value);
//----
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {
        fia_INDEX[li_IND] = li_IND;
    }
   
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {
		  for (li_int = li_IND + 1; li_int < li_size; li_int++)
		  {
			   if (fda_Value[fia_INDEX[li_IND]] < fda_Value[fia_INDEX[li_int]])
			   {
				    li_tmp = fia_INDEX[li_int]; 
				    fia_INDEX[li_int] = fia_INDEX[li_IND]; 
				    fia_INDEX[li_IND] = li_tmp;
			   }
		  }
	 }
//----
    return;
}


К чему тут вообще переменная li_tmp?
Ведь всё сводится к тому, что бы поменять местами 2 соседних значения массива, т.е.

По-моему, так было бы сама то:

PHP:
 if (fda_Value[fia_INDEX[li_IND]] < fda_Value[fia_INDEX[li_int]])
			   {
				    fia_INDEX[li_int] = fia_INDEX[li_IND]; 
			   }


А вот для чего операции?

PHP:
				    li_tmp = fia_INDEX[li_int]; 
				    fia_INDEX[li_IND] = li_tmp;
 

qqmber

Почетный гражданин
К чему тут вообще переменная li_tmp?
Ведь всё сводится к тому, что бы поменять местами 2 соседних значения массива, т.е.

По-моему, так было бы сама то:

PHP:
 if (fda_Value[fia_INDEX[li_IND]] < fda_Value[fia_INDEX[li_int]])
			   {
				    fia_INDEX[li_int] = fia_INDEX[li_IND]; 
			   }
Так ты просто присвоишь новое значение fia_INDEX[li_int]. Старое будет утеряно.
А вот для чего операции?
Только так и можно поменять местами значения. Сохранить во вспомогательной переменной, присвоить, и восстановить сохраненное.
 

gzh

Интересующийся
Уважаемые программисты, подскажите пожалуйста как можно сделать такую вещь:
Чтобы ордер закрывался только тогда, когда он окупит все предыдущие убытки, плюс заработает определенную сумму, которая будет прописана в переменной. ??
Например: 4 ордера ушли в убыток, каждый в убытке 10$ = итого -40$. Ордер должен окупить 40$ и плюс заработать N $, только тогда он закроется.
 

qqmber

Почетный гражданин
НЕ нормально, конечно. Впервые пришлось такую кривизну в коде терпеть и не знаю как избавиться :nda:
Дальше обрабатывается переменная SymbolRow, которая играет роль буферной/временной переменной в цикле.
Строки в MQL4 ограничены по длине, там много через запятую не напишешь.
Это раз.
А два - "дырка" с выбором параметров не делает RESIZE, т.е. список в дырку не влазит, гад такой, и контроль за списком неудобный. К примеру, хочется глянуть, что там такого поназадавал по быстрому, а список "уезжает" за пределы окна вправо и сразу не видно все данные.
Внезапно обнаружил вот такой пост очень в тему.
http://forexsystemsru.com/sovetniki/73016-raspahnut%60-okno-svoistv-eksperta-indikatora.html#post688381
 

ansol

Местный знаток
Уважаемые программисты, подскажите пожалуйста как можно сделать такую вещь:
Чтобы ордер закрывался только тогда, когда он окупит все предыдущие убытки, плюс заработает определенную сумму, которая будет прописана в переменной. ??
Например: 4 ордера ушли в убыток, каждый в убытке 10$ = итого -40$. Ордер должен окупить 40$ и плюс заработать N $, только тогда он закроется.
А в чем проблема-то? Проверить все открытые ордера и сложить отрицательные профиты отдельно, положительные - отдельно, потом сравнить на сколько одна кучка больше другой :D
Имеется в виду OrderProfit() использовать, он в валюте депозита как раз
 

gzh

Интересующийся
Открытый ордер всегда один.
пример системы:
if (OrdersTotal()==0) {
if(Close[1] > Open[1]) OrderSend (Symbol(), 0, lot, Ask, 0 , Ask-sl*Point, Ask+tp*Point);
if (Close[1] <Open[1]) OrderSend (Symbol(), 1, lot, Bid, 0 , Bid+sl*Point, Bid-tp*Point);

А теперь, попробую написать, как ты мне подсказал, если не правильно поправь пожалуйста. 1Проверить все открытые ордера и сложить отрицательные профиты
double ubytok =0;
double profit = 0;
double Nado_profit = 10;

for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
OrderSelect (s,SELECT_BY_POS, MODE_HISTORY);

if (OrderProfit() < 0) ubytok = OrderProfit();

for (int t=0; t<OrdersTotal(); s++) {
OrderSelect (t, SELECT_BY_POS, MODE_TRADES);

profit = OrderProfit();

if (profit >= ubytok && profit >=Nado_profit) {
if (OrderType()==0) OrderClose(OrderTicet(),OrderLots(), Bid,0);
if (OrderType()==1) OrderClose(OrderTicet(),OrderLots(), Ask,0); }}}
 

ansol

Местный знаток
Убыточный тоже всегда один? И он уже закрыт?
А то:
PHP:
if (OrderProfit() < 0) ubytok += OrderProfit();
Опять же, он тебе наскладывает все, что есть в хистори, причем, будет зависеть от того, что у тебя выбрано в хистори - "за последний день", "за последние три дня" и т.д. - будут разные результаты, которые еще и меняются с переходом в следующую дату в полночь. Гхм!
И фигурные скобки весьма забавно закрыты. Может сперва посчитать весь убыток, а потом уже двигаться дальше? В смысле циклы разнести, а не цикл в цикле делать
 
Последнее редактирование:

gzh

Интересующийся
Я не знаю как посчитать "весь убыток". помоги с этим! Дай хотя бы подсказку по действиям, я попробую.
 

ansol

Местный знаток
Ну вот же, все уже готово:
PHP:
for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
 OrderSelect (s,SELECT_BY_POS, MODE_HISTORY);

 if (OrderProfit() < 0) ubytok += OrderProfit();
}
в переменной весь убыток и будет за период хистори
 

gzh

Интересующийся
Вопрос первый: вот этот плюсик перед =, он зачем ?
Вопрос второй: весь код, который я написал, в принципе верный, да?
 

ansol

Местный знаток
Вопрос первый: вот этот плюсик перед =, он зачем ?
Вопрос второй: весь код, который я написал, в принципе верный, да?

Плюсик перед равно прибавляет значение справа к переменной слева.
Т.е. можно написать х=х+10
а можно х+=10
Вот первым циклом собираешь все убытки.
Ну а дальше берешь свой ордер и сравниваешь егонный профит с этими убытками, т.е. во втором цикле находишь этот ордер и т.д. Там вроде верно, если циклы разнести, а то у тебя они друг в друга вложены получились. Перепиши начисто, будет понятнее ;)
 

gzh

Интересующийся
вот полная система. написал этот код, запустил в тестере советник, он открыл один ордер и все и больше ничего не делал. странно. посмотри пожалуйста, что не так. ?? (Система банальна: если цена > цены открытия свечи на N пунктов = Бай, для селл обратная ситуация. Если открыт Бай и цена стала <цены открытия свечи на N пунктов,то происходит переворот (закрывается бай, открывается селл)).

double ubytok =0;
double profit = 0;
double Nado_profit = 10;

for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
OrderSelect (s,SELECT_BY_POS, MODE_HISTORY);

if (OrderProfit() < 0) ubytok += OrderProfit(); }

for (int t=0; t<OrdersTotal(); t++) {
OrderSelect (t, SELECT_BY_POS, MODE_TRADES);

profit = OrderProfit();

if (profit >= ubytok && profit >=Nado_profit) {
if (OrderType()==0) OrderClose(OrderTicet(),OrderLots(), Bid,0);
if (OrderType()==1) OrderClose(OrderTicet(),OrderLots(), Ask,0); }}

for (int p=OrdersTotal()-1; p>=0; p--) {
OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==0 && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Bid,0); }


if (OrderType()==1 && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Ask,0); } }


if (OrdersTotal()==0) {
if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), 0, lot, Ask, 0, 0, 0);

if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), 1, lot, Bid, 0, 0, 0); }
 

ansol

Местный знаток
if (profit >= ubytok && profit >=Nado_profit) {
if (OrderType()==0) OrderClose(OrderTicet(),OrderLots(), Bid,0);
if (OrderType()==1) OrderClose(OrderTicet(),OrderLots(), Ask,0); }}
Как бы:
PHP:
if (profit >= ubytok + Nado_profit) {
 if (OrderType()==OP_BUY) OrderClose(OrderTicet(),OrderLots(), Bid,0);
 if (OrderType()==OP_SELL) OrderClose(OrderTicet(),OrderLots(), Ask,0); }}
Я так понял, что это имелось в виду исходя из первого вопроса - превышение убытка на нужный профит, не?
 

ansol

Местный знаток
for (int t=0; t<OrdersTotal(); t++) {
OrderSelect (t, SELECT_BY_POS, MODE_TRADES);

profit = OrderProfit();
А здесь видимо:
PHP:
for (int t=0; t<OrdersTotal(); t++) {
if(OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit();
Если конечно ордер всегда один
 

hoz

Активный участник
Последнее редактирование модератором:

ansol

Местный знаток
Так я уже как пол года назад нашёл себе такую штуку _http://codebase.mql4.com/ru/8558

Зашибись, чё. А как все-таки эксперта заставить в другое окно что-нибудь писать (Comment() ) или объекты рисовать (ObjectSet() ) ? :D
 
Последнее редактирование модератором:

gzh

Интересующийся
1. вопрос не совсем понял: Я так понял, что это имелось в виду исходя из первого вопроса - превышение убытка на нужный профит, не?

2. Код все-равно не работает, открывает один ордер и с этого момента тестер зависает, до того как ордер открылся все норм, после того как открылся, завис.
Кстати: сам алгоритм открытия и переворота, эта часть кода норм работает.
В чем же может быть проблема, подскажи ? ?????
 

ansol

Местный знаток
Да ХЗ
Текст с опечатками, например if (OrderType()==0) OrderClose(OrderTicet(),OrderLots(), Bid,0);
Исправь и нормальную версию покажи с учетом того, что выше в моих написано. Завтра посмотрим :)
 

gzh

Интересующийся
Проблема в этой части кода. Я ее закоментировал, советник заработал. но без этой части, ордер не будет закрываться, пока не окупит весь убыток.
Ты же программист, ты можешь увидеть , что не так, подскажи. Очень нужна эта вещь!
for (int t=0; t<OrdersTotal(); s++) {
if (OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit();

if (profit >= ubytok + Nado_profit) {
if (OrderType()==0) OrderClose(OrderTicket(),OrderLots(), Bid,0);
if (OrderType()==1) OrderClose(OrderTicket(),OrderLots(), Ask,0); }}
 

ansol

Местный знаток
А это что?
for (int t=0; t<OrdersTotal(); s++)
Если цикл по "t" :(
И тут
if (OrderType()==0) OrderClose(OrderTicket(),OrderLots(), Bid,0);
Напиши
PHP:
if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(), Bid,0);
Я не помню, что такое "0", лучше писать понятнее, надеюсь, что "0" - это купить :)
 
Верх