1 минуту назад, Rigal сказал:Тогда в чем смысл этого объединения?
Ну пусть и работают каждый на своем графике
Не то. Именно в одном. Если не хотите помочь, то зачем пишете
От xbms, 13 апреля, 2013 в Уголок Программиста
1 минуту назад, Rigal сказал:Тогда в чем смысл этого объединения?
Ну пусть и работают каждый на своем графике
Не то. Именно в одном. Если не хотите помочь, то зачем пишете
1 минуту назад, Lexa000 сказал:Ещё можете мне дать код ступидо, ту часть для множителя которая мне нужно, буду признателен
Пожалуйста
там могут быть зависимости на другие библиотеки, но в качестве примера реализации - берите, переиспользуйте
4 минуты назад, Lexa000 сказал:Не то. Именно в одном. Если не хотите помочь, то зачем пишете
Я пишу, чтобы понять, что вы хотите.
Потому, что вы пока не определили вашу идею.
Я уже упомянул две основных категории принципиально покрывающие понятие "объединить два советника"
А внутри этих двух может быть пятьсот вариантов того, что вы под этим понимаете.
например: Открывает ли один советник ордера с учетом лота последнего ордера второго советника?
А позицию последнего ордера другого советника учитывает?
А ордера его закрывает?
А тейки у них общие по сетке, или раздельные?
Потому, что пока у меня складывается впечатление, что вам хочется что-то с чем-то слепить, но никаких мыслей о стратегии этого слепления вас пока не посещали.
Что, в свою очередь, наталкивает на вопрос, а в чем смысл этого всего
И ответ, который у меня напрашивается, вовсе не торопит меня вам помогать
Так что вы расскажите, что там у вас на уме - глядишь, все и прояснится, и помогут вам толковым советом
2 минуты назад, Rigal сказал:Так что вы расскажите, что там у вас на уме - глядишь, все и прояснится, и помогут вам толковым советом
впору заводить ветку по алгоритмам...
11 минут назад, Rigal сказал:Я пишу, чтобы понять, что вы хотите.
Потому, что вы пока не определили вашу идею.
Я уже упомянул две основных категории принципиально покрывающие понятие "объединить два советника"
А внутри этих двух может быть пятьсот вариантов того, что вы под этим понимаете.
например: Открывает ли один советник ордера с учетом лота последнего ордера второго советника?
А позицию последнего ордера другого советника учитывает?
А ордера его закрывает?
А тейки у них общие по сетке, или раздельные?
Потому, что пока у меня складывается впечатление, что вам хочется что-то с чем-то слепить, но никаких мыслей о стратегии этого слепления вас пока не посещали.
Что, в свою очередь, наталкивает на вопрос, а в чем смысл этого всего
И ответ, который у меня напрашивается, вовсе не торопит меня вам помогать
Так что вы расскажите, что там у вас на уме - глядишь, все и прояснится, и помогут вам толковым советом
Я не умею правильно формулировать ответы. Могу честно сказать, я даже не знаю как вам отвечать
Добрый день. Урок № 3. Торговля по индикатору TMA_Fair_. Советник должен на верхней границе индикатора продавать, а закрывать ордер на нижней границе. И наоборот, на нижней границе индикатора покупать, а на верхней закрывать ордер. Так же советник ставит стоп и профит. Проблема в том, что когда цена доходит до верхней, либо нижней границ - советник должен не дожидаясь тейк-профита, закрывать ордер, а он этого не делает. Не могу понять, почему он не хочет закрывать ордер дойдя до одной из г раниц. Помогите пожалуйста.
55 минут назад, Vovan777 сказал:Не могу понять, почему он не хочет закрывать ордер дойдя до одной из г раниц. Помогите пожалуйста.
Потому что скобки не там закрываются. В текущей реализации код просто не причесан, поэтому и непонятно на глаз, в чем проблема. Вот рабочая версия.
Вообще это все можно проверить через обычный Print, расставив его по всему коду вдоль и поперек, и потом уже проверять, почему он не выдается в журнал.
Хотел спросить, есть ещё Книги по mql4, кроме той что в начале?
Вот что у меня вышло
Есть советник - сеточник. к сожалению только закомпилированный.
Особый интерес вызывает функция набора объема.
Т.е. во входных данных вбивается вручную ряд объемов (Volumes), которые и набираются.
причем первый ордер в сетке - в переменной входных параметров Lots.
Еще интересно, то что есть переменная Orders - количество ордеров. Если в переменной volumes например
ряд объемов состоит из 3 элементов (допустим 0.01, 0.02, 0.03), а в Orders стоит 10, то будет выставлена сетка со следующими объемами: 0,01 (lots), 0.01, 0.02, 0.03, 0.01, 0.02, 0.03, 0.01, 0.02, 0.03, 0,01.
Так вот, прошу если кто может написать функцию расчетов объемов, или изложить идею как советник видит объемы? как из строки во входных данных получается размер ордера?
Спасибо!
19 часов назад, Владимир Стариков сказал:Так вот, прошу если кто может написать функцию расчетов объемов, или изложить идею как советник видит объемы? как из строки во входных данных получается размер ордера?
Функцию писать лень, но реализация может быть примерно такая:
в OnInit с помощью функции int StringSplit парсится входная строка с последовательностью лотов.
Результат помещается в массив. Функция вернет количество элементов в массиве, тем самым узнаем- сколько шагов у сетки (в Вашем примере 3). В дальнейшем размер лота можно будет получать из массива.
При строительстве сетки как правило на каждом тике происходит подсчет ордеров в рынке. Зная это количество мы можем рассчитать следующий ордер.
Доброго времени суток!
Пытливый ум желает познать как можно запрограммировать советник или индикатор так, что бы установив их всего лишь на один график в терминале они искали заданные им условия для входа или для подачи любого уведомления:
1) по всем валютным парам.
2) только по заданным валютным парам
3) только по открытым в текущий момент в терминале парам.
Например мне нужно выявлять свечи заданного размера на таймфрейме Н1. Планирую добавить в индикатор функцию, что бы не устанавливать его в 33 окна , а установив на один график он автоматом будет скринить - мониторить все пары.
А если советник установить, то он будет торговать по заданным парам с одного окна.
Перелапатил уже достаточно материала на эту тему, но ничего не нашел.
Может у кого есть индикатор который мониторит насколько валютных пар с одного окна, дайте посмотреть код.
Буду рад любой информации на эту тему.
10 часов назад, mishastar сказал:Буду рад любой информации на эту тему.
Например
/torgovye-sistemy/2/d1h4-two-fingers/16296/
А вообще, в разделе Торговые системы есть насколько тем, где писались мультивалютные индикаторы/советники
вот еще
/torgovye-sistemy/2/h1d1-torgovaya-sistema-quotva-bankquot/8306/?do=findComment&comment=194281
Изменено 30 апреля, 2021 пользователем usver73
Добрый день друзья! Мой уровень знаний языка программирования MQL4 не высокий, так что хочу спросить совета знающий. Пишу простенький сеточник в первые, в общий чертах идея советника такая что после открытия позиции и прохождения цены в нужную сторону, на определенное количество пунктов, надо открыть еще одну позицию, а если цена движется в том же направлении, то и еще...... и еще... . Все позиции с одним ТР и SL. Возможно надо будет трал, но это позже. Сейчас проблема (я думаю не большая) при возникновении ситуации для открытия второго ордера советник открывает очень много (сколько может) ордеров. Как этого избежать? Думаю что по магику отследить уже открытый второй ордер и больше не открывать позицию с этим магиком, а вот как это сделать? Подскажите пожалуйста. Уверен это решение есть. Заранее спасибо.
Вот код для открытия второго ордера:
if ((Torguem==false)==false)
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
{if((OrderType()==OP_BUY)&&(OrderMagicNumber()==Magic1))
// if((OrderType()!=OP_SELL) && ((OrderMagicNumber()!=Magic2)))
// Если цена прошла требуемые 300 (по 5-ти значным котировкам) пунктов, то открываем еще один ордер
{
if (Bid>OrderOpenPrice()+(300*Point))
{
bool op = OrderSend(Symbol(),OP_SELL,Lot,Bid,20, Ask+(SL*Point),Ask-(SL*TP*Point),"Сделка на продажу!",(int)Magic2, 0, Red);
}
}}}}
Изменено 30 апреля, 2021 пользователем Геннадий_Николаев
1 час назад, Геннадий_Николаев сказал:Добрый день друзья! Мой уровень знаний языка программирования MQL4
Я лично скопировал код из уроков по программированию сеточного советника на ютубе и пользуюсь ей не первый год. Все отлично работает. https://youtu.be/qTgBGfPuokg
Здраствуйте! Я вот еще собрал из нескольких сов вот такой, можете подсказать код встречного открытия в процентах: от единицы до максимально возможного. Что-то на подобие хеджа или лока
В 30.04.2021 в 19:55, Геннадий_Николаев сказал:Сейчас проблема (я думаю не большая) при возникновении ситуации для открытия второго ордера советник открывает очень много (сколько может) ордеров. Как этого избежать?
Попробуй это, работает безотказно.
//+---------------------Функция которая не позволяет открывать ордера на каждом тике--------------------+
bool CheckExists(int Type)
{
bool Result=True;
for(int n=0; n<OrdersTotal(); n++)
{
if(OrderSelect(n,SELECT_BY_POS))
if(OrderType()==Type && OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
if(OrderOpenTime()>=Time[0])
Result=False;
}
for(int b=0; b<OrdersHistoryTotal(); b++)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_HISTORY))
if(OrderType()==Type && OrderOpenTime()>=Time[0]
&& OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
Result=False;
}
return(Result);
}
там пишешь функцию и в скобках указываешь тип ордера, например CheckExists(OP_BUY)
1 час назад, diodio сказал:Попробуй это, работает безотказно.
//+---------------------Функция которая не позволяет открывать ордера на каждом тике--------------------+
bool CheckExists(int Type)
{
bool Result=True;
for(int n=0; n<OrdersTotal(); n++)
{
if(OrderSelect(n,SELECT_BY_POS))
if(OrderType()==Type && OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
if(OrderOpenTime()>=Time[0])
Result=False;
}
for(int b=0; b<OrdersHistoryTotal(); b++)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_HISTORY))
if(OrderType()==Type && OrderOpenTime()>=Time[0]
&& OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
Result=False;
}return(Result);
}там пишешь функцию и в скобках указываешь тип ордера, например CheckExists(OP_BUY)
iBarShift(NULL,0,t)>0)
Я думал эта функция не позволяет открывать на каждом тике
extern double Risk = 5;
extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок
extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2
string lock_signalsymbol = "AllSymbol";
static double lock_eqviti,lock_last, lock_lot;
static bool lock_flag,flagADX,old_uptrend;
//2. Функцию start() переименовываем в start_main() и добавляем над ней:
int start_main(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
//3. В функцию init() добавляем
/*init_lock();
return(0);
}
*/
//4. Ниже добавляем:
int init_lock()
{
lock_eqviti=AccountBalance();
lock_lot = 0;
lock_last = Close[0];
flagADX=true;
old_uptrend=false;
signal();
lock_flag = false;
return(0);
}
void start_lock(){
int sig,Step;
if(OrdersTotal()<1){init_lock();return;}
notakeprofit();
if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock();
return;
}
else{
sig=signal();
Step =MathAbs(sig);
if (Step<lock_min_step)
return;
if (Ask>lock_last+(Step*Point) && sig>0 ){
if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue))
lock_last = Ask;
}
if (Bid<lock_last-(Step*Point) && sig<0){
if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue))
lock_last = Bid;
}
}
return;
}
int signal() {
int I, j, result;
double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax;
SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1));
for (j = 120; j >= 0; j--) {
SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j);
for (I = j; I <= j + SSP - 1; I++) {
price = iHigh(lock_signalsymbol, PERIOD_M5,i);
if (SsMax < price)SsMax = price;
price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;}
smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30;
if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;}
if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;}
result = 0;
if (flagADX != old_uptrend && flagADX == true) result = +1;
if (flagADX != old_uptrend && flagADX == false) result = -1;
old_uptrend = flagADX;
}
if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result);
return(0);
}
void CloseAllFirstProfit() {
int I, k=OrdersTotal();
for (I=k-1; I>=0; I--) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
k=OrdersTotal();
for (I=k-1; i>=0; I--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
void ClosePosBySelect()
{
if (OrderType()==OP_BUY) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE))
if (OrderType()==OP_SELL) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE))
return;
}
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int I,k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (I=0; I<k; I++) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots();
return(l);
}
bool notakeprofit(){
bool ok=true;
for (int I=OrdersTotal(); I >=0; I--) if ( OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE))
ok=false;return(ok);
}
return(ok);
}
double NormalizeLot(double lo, bool ro=True, 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.1;
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<ml) l=ml;
if (l>mx) l=mx;
return(l);
}
Хотел спросить мнение экспертов. Я так изменил код и скопировал в советник выше, при компиляции ошибки не выдает. На сколько я правильно всё сделал?
55 минут назад, Lexa000 сказал:extern double Risk = 5;
extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок
extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2
string lock_signalsymbol = "AllSymbol";
static double lock_eqviti,lock_last, lock_lot;
static bool lock_flag,flagADX,old_uptrend;//2. Функцию start() переименовываем в start_main() и добавляем над ней:
int start_main(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}//3. В функцию init() добавляем
/*init_lock();
return(0);
}
*/
//4. Ниже добавляем:
int init_lock()
{
lock_eqviti=AccountBalance();
lock_lot = 0;
lock_last = Close[0];
flagADX=true;
old_uptrend=false;
signal();
lock_flag = false;
return(0);
}void start_lock(){
int sig,Step;
if(OrdersTotal()<1){init_lock();return;}
notakeprofit();
if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock();
return;
}
else{
sig=signal();
Step =MathAbs(sig);
if (Step<lock_min_step)
return;
if (Ask>lock_last+(Step*Point) && sig>0 ){
if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue))
lock_last = Ask;
}
if (Bid<lock_last-(Step*Point) && sig<0){
if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue))
lock_last = Bid;
}
}
return;
}int signal() {
int I, j, result;
double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax;
SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1));
for (j = 120; j >= 0; j--) {
SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j);
for (I = j; I <= j + SSP - 1; I++) {
price = iHigh(lock_signalsymbol, PERIOD_M5,i);
if (SsMax < price)SsMax = price;
price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;}
smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30;
if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;}
if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;}
result = 0;
if (flagADX != old_uptrend && flagADX == true) result = +1;
if (flagADX != old_uptrend && flagADX == false) result = -1;
old_uptrend = flagADX;
}
if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result);
return(0);
}void CloseAllFirstProfit() {
int I, k=OrdersTotal();
for (I=k-1; I>=0; I--) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
k=OrdersTotal();
for (I=k-1; i>=0; I--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}void ClosePosBySelect()
{
if (OrderType()==OP_BUY) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE))
if (OrderType()==OP_SELL) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE))
return;
}double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int I,k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (I=0; I<k; I++) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots();
return(l);
}bool notakeprofit(){
bool ok=true;
for (int I=OrdersTotal(); I >=0; I--) if ( OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE))
ok=false;return(ok);
}
return(ok);
}double NormalizeLot(double lo, bool ro=True, 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.1;
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<ml) l=ml;
if (l>mx) l=mx;
return(l);
}Хотел спросить мнение экспертов. Я так изменил код и скопировал в советник выше, при компиляции ошибки не выдает. На сколько я правильно всё сделал?
Всем доброго времени. Назрел маленький вопросик, хочу вывести на экран профит текущего ордера, делаю это сначала методом перебора в цикле, нахожу ордер в рынке, записываю его профит в переменную и вуаля(
Код:
double runningprofit;
//--------------------------------------------------------
Comment(
"runningprofit = " + DoubleToString(runningprofit)
);
//--------------------------------------------------------
runningprofit = 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)
{
runningprofit=OrderProfit()+OrderCommission()+OrderSwap();
}
else
if(OrderType()==OP_SELL)
{
runningprofit=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
В итоге он показывает постоянно ноль (0,000000)
В чем может быть проблемка? Казалось бы простой перебор и цифра на экран, но увы.
10 часов назад, diodio сказал:В чем может быть проблемка?
Comment(
"runningprofit = " + DoubleToString(runningprofit)
Помести после цикла.
В твоем случае ты объявляешь переменную и сразу выводишь ее значение в Comment/
п.с. зачем в цикле раздельно считаешь профит для БАЙ и СЕЛЛ?
п.п.с. runningprofit = 0; 0 можно присваивать при объявлении переменной. Минус 1 строчка
1 час назад, Геннадий_Николаев сказал:Добрый день, я все попробую обязательно.
Вам в цикле нужно выбирать не просто ордер, а Последний ордер в сетке, т.е. для Бай ордеров ордер с самой низкой ценой, а для Селл с самой высокой.
Возможно нужно выбирать последний ордер не по цене, а по времени открытия. 2-3 страницы назад такой вопрос обсуждался.
В Вашем же коде выбирается рандомно, скорее всего первый ордер. Соответственно, условие на открытие второго ордера всегда выполняется
не подскажите как написать код для того чтобы все ордера какие есть закрывались в определенное время, несмотря в минусе торговле или нет?
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем