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

AlexeyVik

Программист mql4 mql5
2 - во вторых,Алексей - ты ведь кажется был представителем их конторы или даже остался,
Извини, но это такой бред... Я впервые такое слышу.
Меня даже банили там на 10 лет. Но я отстоял свою правоту и бан сняли и остепенили того борзого мудератора. Просто я всегда отстаиваю позицию, что сделай сам по максимуму. Пример привёл в предыдущем ответе.
И действительно, давайте жить дружно! :D
 

Milord

Местный знаток
открыли бай 0.5 лотам, ушли в минус на 20 пунктов.
открылии селл 1.5 лотом, ушли в плюс на 40 пунктов закрыли все.

теперь сравните с этим:

открыли бай 0.5 лота, ушли в минус на 20 пунктов - закрыли
открылии селл 1.0 лота, ушли в плюс на 40 пунктов - закрыли.

все тоже самое, но во втором случае меньше нагрузки на депозит, меньше комиссий, меньше затрат на спреды и меньше затрат на свопы (если позиции перешли через сутки)

ну вот теперь то я понял вашу мысль, идея интересная,надо будет в советнике и проверить на днях,хотя спрэды также будут за два ордера,какая разница параллельно они в работе или по очереди, а вот нагрузка на депозит реально снизится,это верно,так что спасибо за идею!:)
 
Последнее редактирование:

Milord

Местный знаток
...И действительно, давайте жить дружно! :D

ну вот и отлично!:)
на коленке накидал код закрывашки,нужно чтобы она закрывала все ордера,не важно какой тип BUY или SELL, неважно какой пары, все рыночные на счету нужно закрыть, посмотри пожалуйста код, правильно ли я его настрочил,будет ли правильно работать?
PHP:
//--------------ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ--------
void Closed()
{
//--
 for(int i=OrdersTotal()-1;i>=0; i--) 
  {
   OrderSelect(i, SELECT_BY_POS); 
    {
    if(OrderType()==OP_BUY)
     {
     OrderClose(i,OrderLots(),Bid,slippage,Gold);
     return(0);
     }
    if(OrderType()==OP_SELL)
     {
     OrderClose(i,OrderLots(),Ask,slippage,Gold);
     return(0);
     }
   }
 }    
//--
}
//--------------end--------------------
 

AlexeyVik

Программист mql4 mql5
ну вот и отлично!:)
на коленке накидал код закрывашки,нужно чтобы она закрывала все ордера,не важно какой тип BUY или SELL, неважно какой пары, все рыночные на счету нужно закрыть, посмотри пожалуйста код, правильно ли я его настрочил,будет ли правильно работать?
PHP:
//--------------ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ--------void Closed(){//-- for(int i=OrdersTotal()-1;i>=0; i--)   {   OrderSelect(i, SELECT_BY_POS);     {    if(OrderType()==OP_BUY)     {     OrderClose(i,OrderLots(),Bid,slippage,Gold);     return(0);     }    if(OrderType()==OP_SELL)     {     OrderClose(i,OrderLots(),Ask,slippage,Gold);     return(0);     }   } }    //--}//--------------end--------------------
Что-то мне этот вопрос показался провокационным. Не могу я поверить что ты ошибочно воткнул в код return.
А вообще есть недокументированная фишка. Для закрытия всех ордеров, и Sell и Buy, можно использовать цену OrderClosePrice() и не надо делить по условию Buy ордер или Sell. Но если по каким-то причинам ордер не закрылся, рефреш не поможет. В этом случае поможет только повторный выбор ордера OrderSelect()
 

Milord

Местный знаток
Что-то мне этот вопрос показался провокационным. Не могу я поверить что ты ошибочно воткнул в код return.
А вообще есть недокументированная фишка. Для закрытия всех ордеров, и Sell и Buy, можно использовать цену OrderClosePrice() и не надо делить по условию Buy ордер или Sell. Но если по каким-то причинам ордер не закрылся, рефреш не поможет. В этом случае поможет только повторный выбор ордера OrderSelect()
провокационным?:facepalm::)
и в мыслях такого небыло, но правда часть кода где то скопировал, видимо вместе с ретурном, еще хотел его убрать,но рискнул так спросить, так что он там нафиг не нужен?;)
СПАСИБО за фишку - то есть в итоге код будет примерно такой?
PHP:
//--------------ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ-------- 
void Closed() 
{ 
//-- 
 for(int i=OrdersTotal()-1;i>=0; i--)  
  { 
   OrderSelect(i, SELECT_BY_POS);  
    { 
    OrderClose(i,OrderLots(),OrderClosePrice(),slippage,Gold); 
    } 
  }     
//-- 
} 
//--------------end------------

P.S.
Алексей прекрати издеваться над кодом ,вытягивая его в длину!:)
уже не в первый раз эту хрень вижу, где ниче невозможно понять!:facepalm:
 
Последнее редактирование:

mobidik

-----
Что-то мне этот вопрос показался провокационным. Не могу я поверить что ты ошибочно воткнул в код return.
А вообще есть недокументированная фишка. Для закрытия всех ордеров, и Sell и Buy, можно использовать цену OrderClosePrice() и не надо делить по условию Buy ордер или Sell. Но если по каким-то причинам ордер не закрылся, рефреш не поможет. В этом случае поможет только повторный выбор ордера OrderSelect()

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

PS.
На счет OrderClosePrice() - тут ты не прав, т.к. данная ф-ция возвращает цену закрытого ордера и ни как не заменяет предварительный выбор по бай/селл. Да и рефреша в коде ни какого нет... А на счет закрылся ордер или нет - нужно обрабатывать ошибки. Если есть - пауза и на повтор, как ты и написал, как самый простой вариант или выбор дальнейших действий в зависимости от полученной ошибки.
 

Milord

Местный знаток
...Наличие return-ов тут лишнее, а все остальное будет работать. Тогда на одном тике будут закрыты все ордера, если все пройдет без ошибок.
PS.
На счет OrderClosePrice() - тут ты не прав, т.к. данная ф-ция возвращает цену закрытого ордера и ни как не заменяет предварительный выбор по бай/селл. Да и рефреша в коде ни какого нет... А на счет закрылся ордер или нет - нужно обрабатывать ошибки. Если есть - пауза и на повтор, как ты и написал, как самый простой вариант или выбор дальнейших действий в зависимости от полученной ошибки.
то есть вот так будет правильно,код ниже
PHP:
//--------------ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ-------- 
void Closed() 
{ 
//-- 
 for(int i=OrdersTotal()-1;i>=0; i--)  
  { 
   OrderSelect(i, SELECT_BY_POS);  
    { 
    if(OrderType()==OP_BUY) 
     {
     RefreshRates();
     OrderClose(i,OrderLots(),Bid,slippage,Gold); 
     } 
    if(OrderType()==OP_SELL) 
     {
     RefreshRates();
     OrderClose(i,OrderLots(),Ask,slippage,Gold); 
     } 
   } 
 }     
//-- 
} 
//--------------end-----------
 

sergeysv

Активный участник
Подскажите пожалуйста как удалить аккуратно и нежно с помощью кода
SetATL --- N_orderCLPull="PULLZAKRUT"+Kol;
и
SetATL--N_orderCLPull+"PULLZAKRUT"+Kol;
одновременно с N_order="ОРДЕР "+Kol ; ???
ObjectsDeleteAll(0,"ZAKRUTIE",-1,-1);ObjectsDeleteAll(0,"PULLZAKRUT",-1,-1); пробовал,--
не то....
int total=OrdersTotal();
int Kol=0,X_order,tip;
double Y_order;
ArrayInitialize(orders,0);
if (ObjectFind("")==0)
{
}
else {X_order =20;Y_order=110+10*Kol;}
for (int pos=1; pos<=25; pos++)
{ N_order="ОРДЕР "+pos; // РАБОТАЕТ
ObjectDelete(N_order);

N_orderCL="ZAKRUTIE"+pos; // ЭТО НЕ РАБОТАЕТ...
ObjectDelete(N_orderCL);

N_orderCLPull="PULLZAKRUT"+pos; // ЭТО НЕ РАБОТАЕТ...
ObjectDelete(N_orderCLPull);
}
for( pos=0;pos<total;pos++)
{ if (OrderSelect(pos, SELECT_BY_POS)==true)
{ if (OrderSymbol()==Symbol())
{ tip=OrderType();
if (tip == OP_BUY || tip == OP_SELL|| tip == OP_BUYLIMIT|| tip == OP_SELLLIMIT|| tip == OP_BUYSTOP|| tip == OP_SELLSTOP)
{ Kol++; // Считаем общее количество ордеров
orders[Kol][1] = OrderOpenPrice(); // Курс открытия ордеров
orders[Kol][2] = ((OrderOpenPrice() - OrderStopLoss())!=0) ; // SL
orders[Kol][4] = OrderTicket();
orders[Kol][5] = OrderLots();
if (tip == OP_BUY) {orders[Kol][6] = 1; текст = "Buy"; }
else {orders[Kol][6] =-1; текст = "Sell";}
if (tip == OP_BUYLIMIT) {orders[Kol][6] = 1; текст = "BLimit"; }
if (tip == OP_SELLLIMIT) {orders[Kol][6] = 1; текст = "SLimit"; }
if (tip == OP_BUYSTOP) {orders[Kol][6] = 1; текст = "BStop"; }
if (tip == OP_SELLSTOP) {orders[Kol][6] = 1; текст = "SStop"; }
//--------------------- Вывод текущих ордеров на экран
if (UGOL<4){N_order="ОРДЕР "+Kol;
if (orders[Kol][6]==1)
ObjectDelete(N_order);
ObjectCreate(N_order, OBJ_LABEL, 0, 0, 0);
ObjectSet (N_order, OBJPROP_CORNER, UGOL);
ObjectSet (N_order, OBJPROP_XDISTANCE, X_order);
ObjectSet (N_order, OBJPROP_YDISTANCE, Y_order+21*Kol);
if (orders[Kol][2]!=0) txt = DoubleToStr((MarketInfo(OrderSymbol(),MODE_BID)
- OrderOpenPrice()) / (OrderOpenPrice() - OrderStopLoss()),2);

ObjectSetText(N_order,StringConcatenate("" ," ", текст," ","[",DoubleToStr (orders[Kol][5],2),"]",
" ", txt ),12,"Arial Black",Black);

N_orderCL="ZAKRUTIE"+Kol;
ObjectDelete("ZAKRUTIE"+Kol);
SetATL(N_orderCL+"ZAKRUTIE",23," X ",11,"Arial Black",Black,X_order-25,Y_order+21*Kol+1,0,0);
if(ObjectGet(N_orderCL+"ZAKRUTIE",OBJPROP_SELECTED)>0)
ObjectSet(N_orderCL+"ZAKRUTIE",OBJPROP_SELECTED,0);

N_orderCLPull="PULLZAKRUT"+Kol;
ObjectDelete("PULLZAKRUT"+Kol);
SetATL(N_orderCLPull+"PULLZAKRUT",23," X ",11,"Arial Black",Black,X_order+350,Y_order+21*Kol+1,0,0);
if(ObjectGet(N_orderCLPull+"PULLZAKRUT",OBJPROP_SELECTED)>0)
ObjectSet(N_orderCLPull+"PULLZAKRUT",OBJPROP_SELECTED,0);
}
}
}
}
}
void SetATL(string nm,int type,string tx,int fontsize,string font,color clr,int x,int y,int corn,int back, bool select_change=true){
if(ObjectFind(nm)!=0)
ObjectCreate(nm,type,0,0,0);
ObjectSet(nm,OBJPROP_CORNER,corn);
ObjectSet(nm,OBJPROP_COLOR,clr);
ObjectSet(nm,OBJPROP_BGCOLOR,clr);
ObjectSet(nm,OBJPROP_BACK,back);
ObjectSet(nm,OBJPROP_XDISTANCE,x);
ObjectSet(nm,OBJPROP_YDISTANCE,y);
ObjectSet(nm,OBJPROP_BORDER_COLOR,clr);
ObjectSet(nm,OBJPROP_BORDER_TYPE,BORDER_FLAT);
ObjectSet(nm,OBJPROP_HIDDEN,1);
ObjectSetText(nm,tx,fontsize,font,clr);
if(select_change) {
if(ObjectGet(name+"1",OBJPROP_SELECTED)>0)
ObjectSet(name+"1",OBJPROP_SELECTED,0);
}
}
 

AlexeyVik

Программист mql4 mql5
провокационным?:facepalm::)
и в мыслях такого небыло, но правда часть кода где то скопировал, видимо вместе с ретурном, еще хотел его убрать,но рискнул так спросить, так что он там нафиг не нужен?;)
СПАСИБО за фишку - то есть в итоге код будет примерно такой?
PHP:
//--------------ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ-------- void Closed() { //--  for(int i=OrdersTotal()-1;i>=0; i--)    {    OrderSelect(i, SELECT_BY_POS);      {     OrderClose(i,OrderLots(),OrderClosePrice(),slippage,Gold);     }   }     //-- } //--------------end------------
P.S.
Алексей прекрати издеваться над кодом ,вытягивая его в длину!:)
уже не в первый раз эту хрень вижу, где ниче невозможно понять!:facepalm:
Я не трогаю код. Это при цитировании его так корёжит.
Да нет тут ни какой провокации, а есть не точность, как раз таки с этим return-ом. Если в рынке, на момент выполнения условия для закрытия всех ордеров, например, 10 шт., то они, в лучшем случае, будут закрыты за 10 тиков, т.к. при нахождении первого ордера и его удачного закрытия - будет выход из ф-ции, а повторный её запуск будет только на следующем тике. Наличие return-ов тут лишнее, а все остальное будет работать. Тогда на одном тике будут закрыты все ордера, если все пройдет без ошибок.

PS.
На счет OrderClosePrice() - тут ты не прав, т.к. данная ф-ция возвращает цену закрытого ордера и ни как не заменяет предварительный выбор по бай/селл. Да и рефреша в коде ни какого нет... А на счет закрылся ордер или нет - нужно обрабатывать ошибки. Если есть - пауза и на повтор, как ты и написал, как самый простой вариант или выбор дальнейших действий в зависимости от полученной ошибки.
Ты очень ошибаешься. Посмотри в закладке "Торговля" на столбец "Цена". Таких там два. Смотри на второй и сравнивай с ценами Bid и Ask и ты увидишь что эти цены совпадают с ценой Bid у ордеров Buy и с ценой Ask у ордеров Sell.

Потом наоткрывай ордеров побольше и запусти этот скрипт.
 

Вложения

  • CloseAllOrders.mq4
    2,7 КБ · Просмотры: 11
Последнее редактирование:

mobidik

-----
то есть вот так будет правильно,код ниже
PHP:
//--------------ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ-------- 
void Closed() 
{ 
//-- 
 for(int i=OrdersTotal()-1;i>=0; i--)  
  { 
   OrderSelect(i, SELECT_BY_POS);  
    { 
    if(OrderType()==OP_BUY) 
     {
     RefreshRates();
     OrderClose(i,OrderLots(),Bid,slippage,Gold); 
     } 
    if(OrderType()==OP_SELL) 
     {
     RefreshRates();
     OrderClose(i,OrderLots(),Ask,slippage,Gold); 
     } 
   } 
 }     
//-- 
} 
//--------------end-----------

RefreshRates() в таком варианте коде ни к чему, вот если бы ты обрабатывал ошибку и, например, получил ошибку - торговый поток занят, после чего подождал какое-то время и перед повтором закрытия ордера, таки очень даже нужно вызвать эту ф-цию.
 

mobidik

-----
Подскажите пожалуйста как удалить аккуратно и нежно с помощью кода
SetATL --- N_orderCLPull="PULLZAKRUT"+Kol;
и
SetATL--N_orderCLPull+"PULLZAKRUT"+Kol;
одновременно с N_order="ОРДЕР "+Kol ; ???
ObjectsDeleteAll(0,"ZAKRUTIE",-1,-1);ObjectsDeleteAll(0,"PULLZAKRUT",-1,-1); пробовал,--
не то....
int total=OrdersTotal();
int Kol=0,X_order,tip;
double Y_order;
ArrayInitialize(orders,0);
if (ObjectFind("")==0)
{
}
else {X_order =20;Y_order=110+10*Kol;}
for (int pos=1; pos<=25; pos++)
{ N_order="ОРДЕР "+pos; // РАБОТАЕТ
ObjectDelete(N_order);

N_orderCL="ZAKRUTIE"+pos; // ЭТО НЕ РАБОТАЕТ...
ObjectDelete(N_orderCL);

N_orderCLPull="PULLZAKRUT"+pos; // ЭТО НЕ РАБОТАЕТ...
ObjectDelete(N_orderCLPull);
}
for( pos=0;pos<total;pos++)
{ if (OrderSelect(pos, SELECT_BY_POS)==true)
{ if (OrderSymbol()==Symbol())
{ tip=OrderType();
if (tip == OP_BUY || tip == OP_SELL|| tip == OP_BUYLIMIT|| tip == OP_SELLLIMIT|| tip == OP_BUYSTOP|| tip == OP_SELLSTOP)
{ Kol++; // Считаем общее количество ордеров
orders[Kol][1] = OrderOpenPrice(); // Курс открытия ордеров
orders[Kol][2] = ((OrderOpenPrice() - OrderStopLoss())!=0) ; // SL
orders[Kol][4] = OrderTicket();
orders[Kol][5] = OrderLots();
if (tip == OP_BUY) {orders[Kol][6] = 1; текст = "Buy"; }
else {orders[Kol][6] =-1; текст = "Sell";}
if (tip == OP_BUYLIMIT) {orders[Kol][6] = 1; текст = "BLimit"; }
if (tip == OP_SELLLIMIT) {orders[Kol][6] = 1; текст = "SLimit"; }
if (tip == OP_BUYSTOP) {orders[Kol][6] = 1; текст = "BStop"; }
if (tip == OP_SELLSTOP) {orders[Kol][6] = 1; текст = "SStop"; }
//--------------------- Вывод текущих ордеров на экран
if (UGOL<4){N_order="ОРДЕР "+Kol;
if (orders[Kol][6]==1)
ObjectDelete(N_order);
ObjectCreate(N_order, OBJ_LABEL, 0, 0, 0);
ObjectSet (N_order, OBJPROP_CORNER, UGOL);
ObjectSet (N_order, OBJPROP_XDISTANCE, X_order);
ObjectSet (N_order, OBJPROP_YDISTANCE, Y_order+21*Kol);
if (orders[Kol][2]!=0) txt = DoubleToStr((MarketInfo(OrderSymbol(),MODE_BID)
- OrderOpenPrice()) / (OrderOpenPrice() - OrderStopLoss()),2);

ObjectSetText(N_order,StringConcatenate("" ," ", текст," ","[",DoubleToStr (orders[Kol][5],2),"]",
" ", txt ),12,"Arial Black",Black);

N_orderCL="ZAKRUTIE"+Kol;
ObjectDelete("ZAKRUTIE"+Kol);
SetATL(N_orderCL+"ZAKRUTIE",23," X ",11,"Arial Black",Black,X_order-25,Y_order+21*Kol+1,0,0);
if(ObjectGet(N_orderCL+"ZAKRUTIE",OBJPROP_SELECTED)>0)
ObjectSet(N_orderCL+"ZAKRUTIE",OBJPROP_SELECTED,0);

N_orderCLPull="PULLZAKRUT"+Kol;
ObjectDelete("PULLZAKRUT"+Kol);
SetATL(N_orderCLPull+"PULLZAKRUT",23," X ",11,"Arial Black",Black,X_order+350,Y_order+21*Kol+1,0,0);
if(ObjectGet(N_orderCLPull+"PULLZAKRUT",OBJPROP_SELECTED)>0)
ObjectSet(N_orderCLPull+"PULLZAKRUT",OBJPROP_SELECTED,0);
}
}
}
}
}
void SetATL(string nm,int type,string tx,int fontsize,string font,color clr,int x,int y,int corn,int back, bool select_change=true){
if(ObjectFind(nm)!=0)
ObjectCreate(nm,type,0,0,0);
ObjectSet(nm,OBJPROP_CORNER,corn);
ObjectSet(nm,OBJPROP_COLOR,clr);
ObjectSet(nm,OBJPROP_BGCOLOR,clr);
ObjectSet(nm,OBJPROP_BACK,back);
ObjectSet(nm,OBJPROP_XDISTANCE,x);
ObjectSet(nm,OBJPROP_YDISTANCE,y);
ObjectSet(nm,OBJPROP_BORDER_COLOR,clr);
ObjectSet(nm,OBJPROP_BORDER_TYPE,BORDER_FLAT);
ObjectSet(nm,OBJPROP_HIDDEN,1);
ObjectSetText(nm,tx,fontsize,font,clr);
if(select_change) {
if(ObjectGet(name+"1",OBJPROP_SELECTED)>0)
ObjectSet(name+"1",OBJPROP_SELECTED,0);
}
}

:)

PHP:
    if(OrderClose("ОРДЕР "+Kol,......)
     {
       ObjectDelete(0,"ZAKRUTIE"+Kol);
       ObjectDelete(0,"PULLZAKRUT"+Kol);
     }
 

sergeysv

Активный участник
Благодарю--но Чуть мимо.. Картина маслом в коде .
При закрытии описание ордера удаляет а SetATL остаётся.
Вопрос: как этот SetATL вместе с описанием ордера удалять?
 

Вложения

  • 8 exp.mq4
    13,4 КБ · Просмотры: 13

AlexeyVik

Программист mql4 mql5
RefreshRates() в таком варианте коде ни к чему, вот если бы ты обрабатывал ошибку и, например, получил ошибку - торговый поток занят, после чего подождал какое-то время и перед повтором закрытия ордера, таки очень даже нужно вызвать эту ф-цию.
И опять ты неправ.
При входе в цикл цены Ask и Bid имеют какое-то значение и не меняются на протяжении всего цикла. Если цикл продолжался относительно долго, это равносильно тому, что "получил ошибку - торговый поток занят, после чего подождал какое-то время"... В общем RefreshRates() лишним не будет, а если предполагается работать с большим количеством ордеров, то RefreshRates() очень желателен.
 

mobidik

-----
Благодарю--но Чуть мимо.. Картина маслом в коде .
При закрытии описание ордера удаляет а SetATL остаётся.
Вопрос: как этот SetATL вместе с описанием ордера удалять?

Картина маслом в коде - так кто писал?

У SetATL какое имя?
PHP:
N_orderCL="ZAKRUTIE"+Kol;
SetATL(N_orderCL+"ZAKRUTIE",....
Так и удаляй с нужным именем:
PHP:
ObjectDelete(0,N_orderCL+"ZAKRUTIE");
 

mobidik

-----
И опять ты неправ.
При входе в цикл цены Ask и Bid имеют какое-то значение и не меняются на протяжении всего цикла. Если цикл продолжался относительно долго, это равносильно тому, что "получил ошибку - торговый поток занят, после чего подождал какое-то время"... В общем RefreshRates() лишним не будет, а если предполагается работать с большим количеством ордеров, то RefreshRates() очень желателен.

Соглашусь, но каждую задачу нужно решать исходя из самого ТЗ, не к чему прописывать в коде все возможные варианты, которые могут никогда не наступить, при этом увеличить время обработки данных и тут получим, что "цикл продолжался относительно долго" - получим ошибку и тут просто обязаны вызвать RefreshRates(). Повторюсь, все зависит от самого алгоритма работы бота, имхо.
 

MrGreen86

Гуру форума
ну вот теперь то я понял вашу мысль, идея интересная,надо будет в советнике и проверить на днях,хотя спрэды также будут за два ордера,какая разница параллельно они в работе или по очереди, а вот нагрузка на депозит реально снизится,это верно,так что спасибо за идею!:)

в первом случае вы заплатите за спред * 2 лота
во втором случае вы заплатите за спред * 1.5 лота.

спред "платится" не за ордер, а за объем ордера.
 

sergeysv

Активный участник
спред "платится" не за ордер, а за объем ордера.
Сори что вклиниваюсь в вашу дискуссию но вопрос по теме спреда-
Спрэд--это минус к депозиту.
OrderProfit() + OrderCommission() + OrderSwap()---даёт верный минус отнятый у депо..
Как выражается минус по спрэду умноженный на лот если этот минус не отнимается от депо?? как не пытался лот умножать на спрэд сумма была больше реального минуса...
 

AlexeyVik

Программист mql4 mql5
Сори что вклиниваюсь в вашу дискуссию но вопрос по теме спреда-
Спрэд--это минус к депозиту.
OrderProfit() + OrderCommission() + OrderSwap()---даёт верный минус отнятый у депо..
Как выражается минус по спрэду умноженный на лот если этот минус не отнимается от депо?? как не пытался лот умножать на спрэд сумма была больше реального минуса...
Спред это разница цен Ask и Bid, а убыток от спреда есть произведение размера контракта на спред. Если открыть ордер и моментально закрыть его, то убыток составит именно спред.
 
Верх