Ответ
 
Опции темы
Старый 30.09.2013, 14:55   #1701 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Вроде как всё уже уложилось с большего, но вот вопрос:

PHP код:
void fRun_Sort (intfia_INDEX[],     // массив индексов
                
double fda_Value[])   // массив значений
{
    
int li_INDli_intli_tmpli_size ArraySize (fda_Value);
//----
    
for (li_IND 0li_IND li_sizeli_IND++)
    {
        
fia_INDEX[li_IND] = li_IND;
    }
   
    for (
li_IND 0li_IND li_sizeli_IND++)
    {
          for (
li_int li_IND 1li_int li_sizeli_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
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 30.09.2013, 15:15   #1702 (permalink)
Почётный гражданин
 
Аватар для qqmber
 
Регистрация: 20.01.2013
Сообщений: 530
Репутация: 386
qqmber - qqmber - qqmber - qqmber -
Сказал(а) спасибо: 57
Поблагодарили 386 раз(а) в 254 сообщениях
Поинты: 439
Сообщение от hoz Посмотреть сообщение
К чему тут вообще переменная 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]. Старое будет утеряно.
Цитата:
А вот для чего операции?
Только так и можно поменять местами значения. Сохранить во вспомогательной переменной, присвоить, и восстановить сохраненное.
qqmber вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 15:43   #1703 (permalink)
gzh
Интересующийся
 
Аватар для gzh
 
Регистрация: 11.12.2012
Сообщений: 47
Репутация: 2
gzh
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Поинты: 64
Уважаемые программисты, подскажите пожалуйста как можно сделать такую вещь:
Чтобы ордер закрывался только тогда, когда он окупит все предыдущие убытки, плюс заработает определенную сумму, которая будет прописана в переменной. ??
Например: 4 ордера ушли в убыток, каждый в убытке 10$ = итого -40$. Ордер должен окупить 40$ и плюс заработать N $, только тогда он закроется.
gzh вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 15:51   #1704 (permalink)
Почётный гражданин
 
Аватар для qqmber
 
Регистрация: 20.01.2013
Сообщений: 530
Репутация: 386
qqmber - qqmber - qqmber - qqmber -
Сказал(а) спасибо: 57
Поблагодарили 386 раз(а) в 254 сообщениях
Поинты: 439
Сообщение от ansol Посмотреть сообщение
НЕ нормально, конечно. Впервые пришлось такую кривизну в коде терпеть и не знаю как избавиться
Дальше обрабатывается переменная SymbolRow, которая играет роль буферной/временной переменной в цикле.
Строки в MQL4 ограничены по длине, там много через запятую не напишешь.
Это раз.
А два - "дырка" с выбором параметров не делает RESIZE, т.е. список в дырку не влазит, гад такой, и контроль за списком неудобный. К примеру, хочется глянуть, что там такого поназадавал по быстрому, а список "уезжает" за пределы окна вправо и сразу не видно все данные.
Внезапно обнаружил вот такой пост очень в тему.
http://forexsystemsru.com/sovetniki/73016-raspahnut%60-okno-svoistv-eksperta-indikatora.html#post688381
qqmber вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
ansol (01.10.2013)
Старый 01.10.2013, 16:02   #1705 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
Сообщение от gzh Посмотреть сообщение
Уважаемые программисты, подскажите пожалуйста как можно сделать такую вещь:
Чтобы ордер закрывался только тогда, когда он окупит все предыдущие убытки, плюс заработает определенную сумму, которая будет прописана в переменной. ??
Например: 4 ордера ушли в убыток, каждый в убытке 10$ = итого -40$. Ордер должен окупить 40$ и плюс заработать N $, только тогда он закроется.
А в чем проблема-то? Проверить все открытые ордера и сложить отрицательные профиты отдельно, положительные - отдельно, потом сравнить на сколько одна кучка больше другой
Имеется в виду OrderProfit() использовать, он в валюте депозита как раз
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
eevviill (01.10.2013)
Старый 01.10.2013, 16:37   #1706 (permalink)
gzh
Интересующийся
 
Аватар для gzh
 
Регистрация: 11.12.2012
Сообщений: 47
Репутация: 2
gzh
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Поинты: 64
Открытый ордер всегда один.
пример системы:
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); }}}
gzh вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 16:43   #1707 (permalink)
Местный знаток
За призовое место в конкурсе 

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

Последний раз редактировалось ansol; 01.10.2013 в 16:46.
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 16:59   #1708 (permalink)
gzh
Интересующийся
 
Аватар для gzh
 
Регистрация: 11.12.2012
Сообщений: 47
Репутация: 2
gzh
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Поинты: 64
Я не знаю как посчитать "весь убыток". помоги с этим! Дай хотя бы подсказку по действиям, я попробую.
gzh вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 17:05   #1709 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
Ну вот же, все уже готово:
PHP код:
for (int s=OrdersHistoryTotal()-1s>=0s--) {
 
OrderSelect (s,SELECT_BY_POSMODE_HISTORY);

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

в переменной весь убыток и будет за период хистори
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 17:11   #1710 (permalink)
gzh
Интересующийся
 
Аватар для gzh
 
Регистрация: 11.12.2012
Сообщений: 47
Репутация: 2
gzh
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Поинты: 64
Вопрос первый: вот этот плюсик перед =, он зачем ?
Вопрос второй: весь код, который я написал, в принципе верный, да?
gzh вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 17:17   #1711 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
Сообщение от gzh Посмотреть сообщение
Вопрос первый: вот этот плюсик перед =, он зачем ?
Вопрос второй: весь код, который я написал, в принципе верный, да?
Плюсик перед равно прибавляет значение справа к переменной слева.
Т.е. можно написать х=х+10
а можно х+=10
Вот первым циклом собираешь все убытки.
Ну а дальше берешь свой ордер и сравниваешь егонный профит с этими убытками, т.е. во втором цикле находишь этот ордер и т.д. Там вроде верно, если циклы разнести, а то у тебя они друг в друга вложены получились. Перепиши начисто, будет понятнее
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 17:45   #1712 (permalink)
gzh
Интересующийся
 
Аватар для gzh
 
Регистрация: 11.12.2012
Сообщений: 47
Репутация: 2
gzh
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Поинты: 64
вот полная система. написал этот код, запустил в тестере советник, он открыл один ордер и все и больше ничего не делал. странно. посмотри пожалуйста, что не так. ?? (Система банальна: если цена > цены открытия свечи на 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); }
gzh вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 17:52   #1713 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
Цитата:
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_BUYOrderClose(OrderTicet(),OrderLots(), Bid,0);
 if (
OrderType()==OP_SELLOrderClose(OrderTicet(),OrderLots(), Ask,0); }} 
Я так понял, что это имелось в виду исходя из первого вопроса - превышение убытка на нужный профит, не?
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 17:54   #1714 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
Цитата:
for (int t=0; t<OrdersTotal(); t++) {
OrderSelect (t, SELECT_BY_POS, MODE_TRADES);

profit = OrderProfit();
А здесь видимо:
PHP код:
for (int t=0t<OrdersTotal(); t++) {
if(
OrderSelect (tSELECT_BY_POSMODE_TRADES)) profit OrderProfit(); 
Если конечно ордер всегда один
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 17:57   #1715 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от qqmber Посмотреть сообщение
Внезапно обнаружил вот такой пост очень в тему.
http://forexsystemsru.com/sovetniki/...tml#post688381

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

Последний раз редактировалось NSerega; 01.10.2013 в 20:44.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
ansol (01.10.2013)
Старый 01.10.2013, 18:01   #1716 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
Сообщение от hoz Посмотреть сообщение
Так я уже как пол года назад нашёл себе такую штуку _http://codebase.mql4.com/ru/8558
Зашибись, чё. А как все-таки эксперта заставить в другое окно что-нибудь писать (Comment() ) или объекты рисовать (ObjectSet() ) ?

Последний раз редактировалось NSerega; 01.10.2013 в 20:44.
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 18:16   #1717 (permalink)
gzh
Интересующийся
 
Аватар для gzh
 
Регистрация: 11.12.2012
Сообщений: 47
Репутация: 2
gzh
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Поинты: 64
1. вопрос не совсем понял: Я так понял, что это имелось в виду исходя из первого вопроса - превышение убытка на нужный профит, не?

2. Код все-равно не работает, открывает один ордер и с этого момента тестер зависает, до того как ордер открылся все норм, после того как открылся, завис.
Кстати: сам алгоритм открытия и переворота, эта часть кода норм работает.
В чем же может быть проблема, подскажи ? ?????
gzh вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 18:30   #1718 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
Да ХЗ
Текст с опечатками, например if (OrderType()==0) OrderClose(OrderTicet(),OrderLots(), Bid,0);
Исправь и нормальную версию покажи с учетом того, что выше в моих написано. Завтра посмотрим
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 18:35   #1719 (permalink)
gzh
Интересующийся
 
Аватар для gzh
 
Регистрация: 11.12.2012
Сообщений: 47
Репутация: 2
gzh
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Поинты: 64
Проблема в этой части кода. Я ее закоментировал, советник заработал. но без этой части, ордер не будет закрываться, пока не окупит весь убыток.
Ты же программист, ты можешь увидеть , что не так, подскажи. Очень нужна эта вещь!
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); }}
gzh вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2013, 18:41   #1720 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,010
Репутация: 830
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 844 раз(а) в 555 сообщениях
Поинты: 1310
А это что?
Цитата:
for (int t=0; t<OrdersTotal(); s++)
Если цикл по "t"
И тут
Цитата:
if (OrderType()==0) OrderClose(OrderTicket(),OrderLots(), Bid,0);
Напиши
PHP код:
if (OrderType()==OP_BUYOrderClose(OrderTicket(),OrderLots(), Bid,0); 
Я не помню, что такое "0", лучше писать понятнее, надеюсь, что "0" - это купить
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Ответ

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 20:25. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
SEO by vBSEO