Price Data Components
Orders Execution
Miscellaneous
0
Views
0
Downloads
0
Favorites
vHandsTrade
//+------------------------------------------------------------------+
//| vHandsTrade.mq4 |
//| Copyright © 2006, komposter |
//| mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, komposter"
#property link "mailto:komposterius@mail.ru"
extern string vHandsTrade = "< - - - vHandsTrade - - - >";
extern int CommentsCount = 10;
extern color SelectColor = Magenta;
extern color ModifyColor = Yellow;
extern color TrailingColor = Yellow;
//+------------------------------------------------------------------+
//| vHandsTrade.mq4 - ýêñïåðò äëÿ "ðó÷íîé" òîðãîâëè íà òåñòåðå ÌÒ4
//| Ïîäðîáíîå îïèñàíèå - http://articles.mql4.com/ru/195
//|
//| Ïåðåä èñïîëüçîâàíèåì ìîæíî íàñòðîèòü íåêîòîðûå ïàðàìåòðû:
//| RISK - % äåïîçèòà, êîòîðûé áóäåò èñïîëüçîâàòüñÿ ïðè îòêðûòèè ïîçèöèè
//| LOT - ðàçìåð ëîòà, êîòîðûé áóäåò èñïîëüçîâàòüñÿ ïðè îòêðûòèè ïîçèöèè, åñëè óêàçàí RISK = 0
//| STOPLOSS - ðàçìåð ÑòîïËîññ äëÿ îòêðûâàåìûõ ïîçèöèé (åñëè ïðè îòêðûòèè íå äâèãàåòñÿ ëèíèÿ ÑòîïËîññ)
//| TAKEPROFIT - ðàçìåð ÒåéêÏðîôèò äëÿ îòêðûâàåìûõ ïîçèöèé (åñëè ïðè îòêðûòèè íå äâèãàåòñÿ ëèíèÿ ÒåéêÏðîôèò)
//| TRAILINGSTOP - ðàçìåð ÒðåéëèíãÑòîïà, êîòîðûì áóäóò ñîïðîâîæäàòüñÿ âñå ïîçèöèè
//| EXPIRATION - âðåìÿ èñòå÷åíèÿ îòëîæåííûõ îðäåðîâ (â ÷àñàõ)
//|
//| Êàæäîìó èç ýòèõ ïàðàìåòðîâ ñîîòâåòñòâóåò 2 ïåðåìåííûå:
//| Ìàññèâ (íàïðèìåð RISK[]) - 5 ÷èñåë, èç êîòîðûõ ìîæíî áóäåò âûáèðàòü çíà÷åíèå ïàðàìåòðà â ïðîöåññå ðàáîòû.
//| È ïåðåìåííàÿ SELECTED_*** (íàïðèìåð, SELECTED_RISK) - ¹ ÷èñëà èç ìàññèâà, êîòîðîå áóäåò âûáðàííî ïî óìîë÷àíèþ.
//|
//| Íàïðèìåð, åñëè âû èñïîëüçóåòå ÑòîïËîññû 20, 40, 60 è 80 ïóíêòîâ (è 0, ò.å. íå èñïîëüçóåòå), çàïîëíèòå ìàññèâ
//| STOPLOSS âîò òàê: "int STOPLOSS[] = { 0, 20, 40, 60, 80 };"
//| Äëÿ èñïîëüçîâàíèÿ ïî óìîë÷àíèþ ÑòîïËîññà 40 ïóíêòîâ, óêàæèòå "int SELECTED_STOPLOSS = 3;" (÷èñëî 40 - 3-å â ñïèñêå)
int RISK[] = { 0, 2, 5, 10, 25 };
int SELECTED_RISK = 1;
double LOT[] = { 0.1, 0.2, 0.5, 1.0, 5.0 };
int SELECTED_LOT = 1;
int STOPLOSS[] = { 0, 15, 25, 50, 100 };
int SELECTED_STOPLOSS = 4;
int TAKEPROFIT[] = { 0, 50, 100, 150, 250 };
int SELECTED_TAKEPROFIT = 1;
int TRAILINGSTOP[] = { 0, 15, 25, 50, 100 };
int SELECTED_TRAILINGSTOP = 4;
double EXPIRATION[] = { 0, 0.5, 1, 12, 24 };
int SELECTED_EXPIRATION = 1;
//| MIN_TRADE_PAUSE_MS - ìèíèìàëüíàÿ ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè (ìñ).
//| Åñëè ïðè òîðãîâëå áåç ïàóçû ó âàñ óñòàíàâëèâàåòñÿ íåñêîëüêî îäèíàêîâûõ îðäåðîâ, ñäåëàéòå MIN_TRADE_PAUSE_MS áîëüøå.
#define MIN_TRADE_PAUSE_MS 750
//| Äàëüøå ñîâåòóþ íè÷åãî íå òðîãàòü ;)
//+------------------------------------------------------------------+
#include <VisualTestingTools.mq4>
int preTime = 0, BarsInWindow = 0, preBarsInWindow = 0, SecondsInBar = 0, Panel_Width = 0, Panel_T1 = 0, Panel_T2 = 0, left[3], right[3];
double WindowHighest = 0.0, WindowLowest = 0.0, preWindowHighest = 0.0, preWindowLowest = 0.0, Panel_P1 = 0.0, Panel_P2 = 0.0;
double Shag_X = 0.0, Zazor_X = 0.0, Dlina_X = 0.0, Shag_Y = 0.0, up[14];
double Lot = 0.1;
int Risk = 0, StopLoss = 50, TakeProfit = 150, TrailingStop = 50, Expiration = 0;
bool NeedRedrawObjects = true;
bool error = false;
string comment[];
int vhtLotDigits = 0;
int lastB = 0, lastS = 0, lastBS = 0, lastSS = 0, lastBL = 0, lastSL = 0;
int init()
{
error = false;
if ( !IsTesting() ) { Alert( "vHandsTrade: ñîâåòíèê ïðåäíàçíà÷åí òîëüêî äëÿ òåñòèðîâàíèÿ!" ); error = true; return(-1); }
//---- ïðîâåðÿåì óêàçàííûå ïîëüçîâàòåëåì ïàðàìåòðû
if ( SELECTED_RISK < 1 || SELECTED_RISK > 5 ) { Alert( "íåïðàâèëüíîå çíà÷åíèå SELECTED_RISK!" ); error = true; }
if ( ArraySize( RISK ) < 1 || ArraySize( RISK ) > 5 ) { Alert( "íåïðàâèëüíîå êîëè÷åñòâî çíà÷åíèé â ìàññèâå RISK!" ); error = true; }
if ( SELECTED_LOT < 1 || SELECTED_LOT > 5 ) { Alert( "íåïðàâèëüíîå çíà÷åíèå SELECTED_LOT!" ); error = true; }
if ( ArraySize( LOT ) < 1 || ArraySize( LOT ) > 5 ) { Alert( "íåïðàâèëüíîå êîëè÷åñòâî çíà÷åíèé â ìàññèâå LOT!" ); error = true; }
if ( SELECTED_STOPLOSS < 1 || SELECTED_STOPLOSS > 5 ) { Alert( "íåïðàâèëüíîå çíà÷åíèå SELECTED_STOPLOSS!" ); error = true; }
if ( ArraySize( STOPLOSS ) < 1 || ArraySize( STOPLOSS ) > 5 ) { Alert( "íåïðàâèëüíîå êîëè÷åñòâî çíà÷åíèé â ìàññèâå STOPLOSS!" ); error = true; }
if ( SELECTED_TAKEPROFIT < 1 || SELECTED_TAKEPROFIT > 5 ) { Alert( "íåïðàâèëüíîå çíà÷åíèå SELECTED_TAKEPROFIT!" ); error = true; }
if ( ArraySize( TAKEPROFIT ) < 1 || ArraySize( TAKEPROFIT ) > 5 ) { Alert( "íåïðàâèëüíîå êîëè÷åñòâî çíà÷åíèé â ìàññèâå TAKEPROFIT!" ); error = true; }
if ( SELECTED_TRAILINGSTOP < 1 || SELECTED_TRAILINGSTOP > 5 ) { Alert( "íåïðàâèëüíîå çíà÷åíèå SELECTED_TRAILINGSTOP!" ); error = true; }
if ( ArraySize( TRAILINGSTOP ) < 1 || ArraySize( TRAILINGSTOP ) > 5 ) { Alert( "íåïðàâèëüíîå êîëè÷åñòâî çíà÷åíèé â ìàññèâå TRAILINGSTOP!" ); error = true; }
if ( SELECTED_EXPIRATION < 1 || SELECTED_EXPIRATION > 5 ) { Alert( "íåïðàâèëüíîå çíà÷åíèå SELECTED_EXPIRATION!" ); error = true; }
if ( ArraySize( EXPIRATION ) < 1 || ArraySize( EXPIRATION ) > 5 ) { Alert( "íåïðàâèëüíîå êîëè÷åñòâî çíà÷åíèé â ìàññèâå EXPIRATION!" ); error = true; }
if ( error ) { return(-1); }
//---- îïðåäåëÿåì çíà÷åíèÿ ïî óìîë÷àíèþ
Risk = RISK[SELECTED_RISK-1];
Lot = LOT[SELECTED_LOT-1];
StopLoss = STOPLOSS[SELECTED_STOPLOSS-1];
TakeProfit = TAKEPROFIT[SELECTED_TAKEPROFIT-1];
TrailingStop = TRAILINGSTOP[SELECTED_TRAILINGSTOP-1];
Expiration = EXPIRATION[SELECTED_EXPIRATION-1]*3600.0;
vhtLotDigits = 0;
double tmp = MarketInfo( Symbol(), MODE_LOTSTEP );
while ( NormalizeDouble( 1.0 - tmp, 4 ) > 0.0 )
{
tmp *= 10;
vhtLotDigits ++;
}
//---- ñòàâèì ïîìåòêó î ïåðåðèñîâêå îáúåêòîâ
NeedRedrawObjects = true;
//---- ïðîñ÷èòûâàåì êîîðäèíàòû îáúåêòîâ
vHandsTrade_ReCount();
//---- ïåðåðèñîâûâàåì îáúåêòû
vHandsTrade_RefreshObjects();
//---- èíèöèàëèçèðóåì çàêëàäêè "òåðìèíàë" è "èñòîðèÿ ñ÷åòà"
vTerminalInit();
vHistoryInit();
ArrayResize( comment, CommentsCount );
for ( int i = CommentsCount-1; i >= 0; i -- ) comment[i] = "";
return(0);
}
int deinit()
{
if ( error ) { return(-1); }
//---- óäàëÿåì âñå ñëåäû ðàáîòû
vHandsTrade_DeleteObjects();
Comment( "" );
return(0);
}
int start()
{
if ( error ) { return(-1); }
//---- ïðîâåðÿåì, íå âûáðàë ëè ïîëüçîâàòåëü äðóãîå çíà÷åíèå ÑË/ÒÏ/ÒÑ/Ëîòà è ò.ä.
vHandsTrade_CheckSelection();
//---- ïðîâåðÿåì, íå íàäî ëè îòêðûòü ïîçèöèþ
vHandsTrade_Open();
//---- ïðîâåðÿåì, íå íàäî ëè çàêðûòü ïîçèöèþ
vHandsTrade_Close();
//---- ïðîâåðÿåì, íå íàäî ëè ìîäèôèöèðîâàòü ïîçèöèþ
vHandsTrade_Modify();
//---- ïîãîëîâíûé òðåéëèíã
vHandsTrade_TrailingStop();
//---- ïåðåñ÷èòûâàåì êîîðäèíàòû îáúåêòîâ
vHandsTrade_ReCount();
//---- ïåðåðèñîâûâàåì îáúåêòû
vHandsTrade_RefreshObjects();
//---- îáíîâëÿåì çàêëàäêè "òåðìèíàë" è "èñòîðèÿ ñ÷åòà"
vTerminalRefresh();
vHistoryRefresh();
return(0);
}
void vHandsTrade_CheckSelection()
{
string name;
for ( int i = 1; i < 6; i ++ )
{
name = "vHT_Risk" + i;
if ( Panel_T1+(i+1)*Shag_X == ObjectGet( name, OBJPROP_TIME1 ) && up[8] == ObjectGet( name, OBJPROP_PRICE1 ) ) { continue; }
NeedRedrawObjects = true;
SELECTED_RISK = i;
Risk = RISK[SELECTED_RISK-1];
break;
}
for ( i = 1; i < 6; i ++ )
{
name = "vHT_Lot" + i;
if ( Panel_T1+(i+1)*Shag_X == ObjectGet( name, OBJPROP_TIME1 ) && up[9] == ObjectGet( name, OBJPROP_PRICE1 ) ) { continue; }
NeedRedrawObjects = true;
SELECTED_LOT = i;
Lot = LOT[SELECTED_LOT-1];
break;
}
for ( i = 1; i < 6; i ++ )
{
name = "vHT_StopLoss" + i;
if ( Panel_T1+(i+1)*Shag_X == ObjectGet( name, OBJPROP_TIME1 ) && up[10] == ObjectGet( name, OBJPROP_PRICE1 ) ) { continue; }
NeedRedrawObjects = true;
SELECTED_STOPLOSS = i;
StopLoss = STOPLOSS[SELECTED_STOPLOSS-1];
break;
}
for ( i = 1; i < 6; i ++ )
{
name = "vHT_TakeProfit" + i;
if ( Panel_T1+(i+1)*Shag_X == ObjectGet( name, OBJPROP_TIME1 ) && up[11] == ObjectGet( name, OBJPROP_PRICE1 ) ) { continue; }
NeedRedrawObjects = true;
SELECTED_TAKEPROFIT = i;
TakeProfit = TAKEPROFIT[SELECTED_TAKEPROFIT-1];
break;
}
for ( i = 1; i < 6; i ++ )
{
name = "vHT_TrailingStop" + i;
if ( Panel_T1+(i+1)*Shag_X == ObjectGet( name, OBJPROP_TIME1 ) && up[12] == ObjectGet( name, OBJPROP_PRICE1 ) ) { continue; }
NeedRedrawObjects = true;
SELECTED_TRAILINGSTOP = i;
TrailingStop = TRAILINGSTOP[SELECTED_TRAILINGSTOP-1];
break;
}
for ( i = 1; i < 6; i ++ )
{
name = "vHT_Expiration" + i;
if ( Panel_T1+(i+1)*Shag_X == ObjectGet( name, OBJPROP_TIME1 ) && up[13] == ObjectGet( name, OBJPROP_PRICE1 ) ) { continue; }
NeedRedrawObjects = true;
SELECTED_EXPIRATION = i;
Expiration = EXPIRATION[SELECTED_EXPIRATION-1]*3600.0;
break;
}
}
void vHandsTrade_Open()
{
vHandsTrade_OpenBuy();
vHandsTrade_OpenSell();
vHandsTrade_OpenBuyStop();
vHandsTrade_OpenSellStop();
vHandsTrade_OpenBuyLimit();
vHandsTrade_OpenSellLimit();
}
void vHandsTrade_Close()
{
if ( TerminalRows <= 0 ) { return(0); }
if ( vTerminal_win < 0 ) { return(-1); }
int _GetLastError;
//---- ïåðåáèðàåì âñå ïîçèöèè, îòîáðàæåííûå â òåðìèíàëå
for ( int i = 0; i < TerminalRows; i ++ )
{
//---- åñëè èçìåíèëàñü îäíà èç êîîðäèíàò îáúåêòà "Òèêåò",
if ( ObjectGet( "Ticket_" + i, OBJPROP_XDISTANCE ) != shift1 || ObjectGet( "Ticket_" + i, OBJPROP_YDISTANCE ) != vshift*(i+2) )
{
//---- åñëè îáúåêò íå óäàëåí,
if ( GetLastError() != 4202 )
{
//---- çàïîìèíàåì è ïûòàåìñÿ âûáðàòü ñîîòâåòñòâóþùèé òèêåò
int ticket = StrToInteger( ObjectDescription( "Ticket_" + i ) );
if ( ticket > 0 )
{
if ( !OrderSelect( ticket, SELECT_BY_TICKET ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", ticket, ", SELECT_BY_TICKET ) - Error #", _GetLastError );
}
else
{
//---- åñëè òàêîé îðäåð åñòü, è îí íå çàêðûò,
if ( OrderCloseTime() <= 0 )
{
//---- åñëè ýòî ìàðêåò-ïîçèöèÿ (áàé èëè ñåëë)
if ( OrderType() < 2 )
{
//---- çàêðûâàåì ïîçèöèþ
if ( OrderType() == OP_BUY )
{
if ( !OrderClose( ticket, OrderLots(), Bid, 3, BuyOPColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè çàêðûòèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " çàêðûò óñïåøíî!" );
}
}
else
{
if ( !OrderClose( ticket, OrderLots(), Ask, 3, SellOPColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè çàêðûòèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " çàêðûò óñïåøíî!" );
}
}
}
//---- åñëè ýòî îòëîæåííûé îðäåð, óäàëÿåì åãî
else
{
if ( !OrderDelete( ticket ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè óäàëåíèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " óäàëåí óñïåøíî!" );
}
}
}
}
}
}
//---- ñîçäàåì ïåðåìåùåííûé/óäàëåííûé îáúåêò "òèêåò"
vLabel( vTerminal_win, "Ticket_" + i, shift1 , vshift*(i+2) );
}
}
}
void vHandsTrade_Modify()
{
if ( TerminalRows <= 0 ) { return(0); }
if ( vTerminal_win < 0 ) { return(-1); }
int _GetLastError, tmp, ticket;
bool modifyOP = false, modifySL = false, modifyTP = false;
bool deleteOP = false, deleteSL = false, deleteTP = false;
//---- ïåðåáèðàåì âñå ïîçèöèè, îòîáðàæåííûå â òåðìèíàëå
for ( int i = 0; i < TerminalRows; i ++ )
{
//---- îáíóëÿåì ôëàãè çàêðûòèÿ è ìîäèôèêàöèè
modifyOP = false; modifySL = false; modifyTP = false;
deleteOP = false; deleteSL = false; deleteTP = false;
//---- åñëè èçìåíèëàñü êîîðäèíàòà îáúåêòà OpenPrice,
if ( ObjectGet( "OpenPrice_" + i, OBJPROP_XDISTANCE ) != shift5 || ObjectGet( "OpenPrice_" + i, OBJPROP_YDISTANCE ) != vshift*(i+2) )
{
//---- äåëàåì ïîìåòêó, óäàëåí ýòîò îáúåêò èëè ïðîñòî ïåðåìåùåí
if ( GetLastError() == 4202 )
{ deleteOP = true; }
else
{ modifyOP = true; }
//---- ñîçäà¸ì åãî çàíîâî
vLabel( vTerminal_win, "OpenPrice_" + i, shift5 , vshift*(i+2) );
}
//---- òî æå ñàìîå äëÿ StopLoss
if ( ObjectGet( "StopLoss_" + i, OBJPROP_XDISTANCE ) != shift6 || ObjectGet( "StopLoss_" + i, OBJPROP_YDISTANCE ) != vshift*(i+2) )
{
if ( GetLastError() == 4202 )
{ deleteSL = true; }
else
{ modifySL = true; }
vLabel( vTerminal_win, "StopLoss_" + i, shift6 , vshift*(i+2) );
}
//---- òî æå ñàìîå äëÿ TakeProfit
if ( ObjectGet( "TakeProfit_" + i, OBJPROP_XDISTANCE ) != shift7 || ObjectGet( "TakeProfit_" + i, OBJPROP_YDISTANCE ) != vshift*(i+2) )
{
if ( GetLastError() == 4202 )
{ deleteTP = true; }
else
{ modifyTP = true; }
vLabel( vTerminal_win, "TakeProfit_" + i, shift7 , vshift*(i+2) );
}
//---- åñëè íå ïðîèçîøëî íè îäíîãî èçìåííåíèÿ, ïåðåõîäèì ê ñëåäóþùåìó îðäåðó
if ( !modifyOP && !modifySL && !modifyTP && !deleteOP && !deleteSL && !deleteTP ) { continue; }
//---- åñëè èçìåíåíèå áûëî, íà÷èíàåì åãî îáðàáàòûâàòü:
//---- çàïîìèíàåì òèêåò
ticket = StrToInteger( ObjectDescription( "Ticket_" + i ) );
if ( ticket <= 0 ) { continue; }
//---- âûáèðàåì åãî
if ( !OrderSelect( ticket, SELECT_BY_TICKET ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", ticket, ", SELECT_BY_TICKET ) - Error #", _GetLastError );
continue;
}
//---- ïðîâåðÿåì, íå çàêðûëñÿ ëè îí
if ( OrderCloseTime() > 0 ) { continue; }
//---- åñëè áûë óäàëåí îáúåêò OpenPrice,
if ( deleteOP )
{
//---- åñëè ýòî ìàðêåò-îðäåð, çàêðûâàåì åãî
if ( OrderType() < 2 )
{
if ( OrderType() == OP_BUY )
{
if ( !OrderClose( ticket, OrderLots(), Bid, 3, BuyOPColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè çàêðûòèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " çàêðûò óñïåøíî!" );
}
}
else
{
if ( !OrderClose( ticket, OrderLots(), Ask, 3, SellOPColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè çàêðûòèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " çàêðûò óñïåøíî!" );
}
}
}
//---- à åñëè îòëîæåííûé, óäàëÿåì
else
{
if ( !OrderDelete( ticket ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè óäàëåíèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " óäàëåí óñïåøíî!" );
}
}
}
//---- åñëè îáúåêò OpenPrice áûë ïåðåìåùåí,
if ( modifyOP )
{
//---- åñëè ýòî îòëîæåííûé îðäåð, ñîçäà¸ì ëèíèþ, ñ ïîìîùüþ êîòîðîé ìîæíî áóäåò èçìåíèòü îáúåêò
if ( OrderType() > 1 )
{
CreateHLine( "vHT_Modify_OP_" + ticket, OrderOpenPrice(), STYLE_SOLID, 1, ModifyColor, ticket + ": modify OpenPrice" );
}
}
//---- åñëè îáúåêò ÑòîïËîññ áûë óäàëåí, óäàëÿåì ÑòîïËîññ ó îðäåðà
if ( deleteSL )
{
if ( OrderStopLoss() > 0 )
{
if ( !OrderModify( ticket, OrderOpenPrice(), 0.0, OrderTakeProfit(), OrderExpiration(), ModifyColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè ìîäèôèêàöèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " ìîäèôèöèðîâàí óñïåøíî!" );
}
}
}
//---- åñëè îáúåêò ÑòîïËîññ áûë ïåðåìåùåí,
if ( modifySL )
{
//---- íàõîäèì, êóäà ðèñîâàòü ëèíèþ ïåðåìåùåíèÿ ÑË, è ðèñóåì
if ( OrderStopLoss() > 0 )
{
CreateHLine( "vHT_Modify_SL_" + ticket, OrderStopLoss(), STYLE_DASHDOT, 1, ModifyColor, ticket + ": modify StopLoss" );
}
else
{
tmp = StopLoss;
if ( tmp <= 0 ) { tmp = 50; }
if ( OrderType() == OP_BUY || OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT )
{ CreateHLine( "vHT_Modify_SL_" + ticket, OrderOpenPrice() - tmp*Point, STYLE_DASHDOT, 1, ModifyColor, ticket + ": modify StopLoss" ); }
else
{ CreateHLine( "vHT_Modify_SL_" + ticket, OrderOpenPrice() + tmp*Point, STYLE_DASHDOT, 1, ModifyColor, ticket + ": modify StopLoss" ); }
}
}
//---- òî æå ñàìîå äëÿ ÒÏ
if ( deleteTP )
{
if ( OrderTakeProfit() > 0 )
{
if ( !OrderModify( ticket, OrderOpenPrice(), OrderStopLoss(), 0.0, OrderExpiration(), ModifyColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè ìîäèôèêàöèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " ìîäèôèöèðîâàí óñïåøíî!" );
}
}
}
if ( modifyTP )
{
if ( OrderTakeProfit() > 0 )
{
CreateHLine( "vHT_Modify_TP_" + ticket, OrderTakeProfit(), STYLE_DASHDOT, 1, ModifyColor, ticket + ": modify TakeProfit" );
}
else
{
tmp = TakeProfit;
if ( tmp <= 0 ) { tmp = 50; }
if ( OrderType() == OP_BUY || OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT )
{ CreateHLine( "vHT_Modify_TP_" + ticket, OrderOpenPrice() + tmp*Point, STYLE_DOT, 1, ModifyColor, ticket + ": modify TakeProfit" ); }
else
{ CreateHLine( "vHT_Modify_TP_" + ticket, OrderOpenPrice() - tmp*Point, STYLE_DOT, 1, ModifyColor, ticket + ": modify TakeProfit" ); }
}
}
}
ObjectsRedraw();
//---- òåïåðü èññëåäóåì ëèíèè ìîäèôèêàöèè...
int objectstotal = ObjectsTotal(); string name = "", modify; double newValue, oldValue, stoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL )*Point + Point;
//---- ïåðåáèðàåì îáúåêòû,
for ( i = objectstotal; i >= 0; i -- )
{
//---- åñëè â èìåíè îáúåêòà åñòü ñòðîêà "vHT_Modify_",
name = ObjectName(i);
if ( StringSubstr( name, 0, 11 ) == "vHT_Modify_" )
{
//---- çàïîìèíàåì òèêåò
ticket = StrToInteger( StringSubstr( name, 14 ) );
if ( ticket <= 0 ) { continue; }
//---- íàõîäèì ïîìåòêó î òîì, ÷òî èìåííî íàäî ìåíÿòü
modify = StringSubstr( name, 11, 2 );
//---- çàïîìèíàåì óðîâåíü, íà êîòîðûé áóäåò ïåðåìåùåí óðîâåíü îòêðûòèÿ/ÑË/ÒÏ
newValue = ObjectGet( name, OBJPROP_PRICE1 );
if ( newValue <= 0 ) { continue; }
if ( !OrderSelect( ticket, SELECT_BY_TICKET ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", ticket, ", SELECT_BY_TICKET ) - Error #", _GetLastError );
continue;
}
if ( OrderCloseTime() > 0 ) { ObjectDelete( name ); continue; }
//---- åñëè ìîäèôèöèðîâàòü íàäî öåíó îòêðûòèÿ,
if ( modify == "OP" )
{
//---- åñëè ýòî îòëîæåííûé îðäåð,
if ( OrderType() > 1 )
{
//---- åñëè ëèíèþ ïåðåìåñòèëè,
if ( NormalizeDouble( OrderOpenPrice() - newValue, Digits ) > 0 || NormalizeDouble( newValue - OrderOpenPrice(), Digits ) > 0 )
{
if ( OrderType() == OP_BUYSTOP )
{
if ( NormalizeDouble( ( newValue - Ask ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíàÿ öåíà îòêðûòèÿ äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
if ( OrderType() == OP_BUYLIMIT )
{
if ( NormalizeDouble( ( Ask - newValue ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíàÿ öåíà îòêðûòèÿ äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
if ( OrderType() == OP_SELLSTOP )
{
if ( NormalizeDouble( ( Bid - newValue ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíàÿ öåíà îòêðûòèÿ äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
if ( OrderType() == OP_SELLLIMIT )
{
if ( NormalizeDouble( ( newValue - Bid ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíàÿ öåíà îòêðûòèÿ äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
//---- ìîäèôèöèðóåì îðäåð
if ( !OrderModify( ticket, newValue, OrderStopLoss(), OrderTakeProfit(), OrderExpiration(), ModifyColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè ìîäèôèêàöèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " ìîäèôèöèðîâàí óñïåøíî!" );
//---- è óäàëåì ëèíèþ
ObjectDelete( name );
}
}
}
}
//---- åñëè ìîäèôèöèðîâàòü íàäî ÑòîïËîññ,
if ( modify == "SL" )
{
//---- íàõîäèì èñõîäíîå ïîëîæåíèå ëèíèè
if ( OrderStopLoss() > 0 )
{
oldValue = OrderStopLoss();
}
else
{
tmp = StopLoss;
if ( tmp <= 0 ) { tmp = 50; }
if ( OrderType() == OP_BUY || OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT )
{ oldValue = OrderOpenPrice() - tmp*Point; }
else
{ oldValue = OrderOpenPrice() + tmp*Point; }
}
//---- è, åñëè ëèíèÿ áûëà ïåðåìåùåíà, ìîäèôèöèðóåì îðäåð
if ( NormalizeDouble( oldValue - newValue, Digits ) > 0 || NormalizeDouble( newValue - oldValue, Digits ) > 0 )
{
if ( OrderType() == OP_BUY || OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP )
{
if ( NormalizeDouble( MathAbs( Bid - newValue ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
else
{
if ( NormalizeDouble( MathAbs( Ask - newValue ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
if ( !OrderModify( ticket, OrderOpenPrice(), newValue, OrderTakeProfit(), OrderExpiration(), ModifyColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè ìîäèôèêàöèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " ìîäèôèöèðîâàí óñïåøíî!" );
ObjectDelete( name );
}
}
}
//---- òî æå ñàìîå äëÿ ÒÏ
if ( modify == "TP" )
{
if ( OrderTakeProfit() > 0 )
{
oldValue = OrderTakeProfit();
}
else
{
tmp = TakeProfit;
if ( tmp <= 0 ) { tmp = 50; }
if ( OrderType() == OP_BUY || OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT )
{ oldValue = OrderOpenPrice() + tmp*Point; }
else
{ oldValue = OrderOpenPrice() - tmp*Point; }
}
if ( NormalizeDouble( oldValue - newValue, Digits ) > 0 || NormalizeDouble( newValue - oldValue, Digits ) > 0 )
{
if ( OrderType() == OP_BUY || OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP )
{
if ( NormalizeDouble( MathAbs( Bid - newValue ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
else
{
if ( NormalizeDouble( MathAbs( Ask - newValue ) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ îðäåðà ¹" + ticket + "!!!" );
continue;
}
}
if ( !OrderModify( ticket, OrderOpenPrice(), OrderStopLoss(), newValue, OrderExpiration(), ModifyColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè ìîäèôèêàöèè îðäåðà ¹" + ticket + "!!!" );
}
else
{
MultiComment( "Îðäåð ¹" + ticket + " ìîäèôèöèðîâàí óñïåøíî!" );
ObjectDelete( name );
}
}
}
}
}
GetLastError();
}
void vHandsTrade_TrailingStop()
{
//---- åñëè òðåéëèíã áîëüøå 0 (âêëþ÷åí), ïåðåáèðàåì âñå îòêðûòûå ïîçèöèè è äâèãàåì èõ ñòÎÏÛ çà íèìè ;)
if ( TrailingStop > 0 )
{
int _GetLastError, _OrdersTotal = OrdersTotal();
for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
if ( !OrderSelect( z, SELECT_BY_POS, MODE_TRADES ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", z, ", SELECT_BY_POS, MODE_TRADES ) - Error #", _GetLastError );
continue;
}
if ( TrailingStop <= MarketInfo( OrderSymbol(), MODE_STOPLEVEL )+1 ) { continue; }
if ( OrderType() == OP_BUY )
{
if ( NormalizeDouble( Bid - OrderOpenPrice() - TrailingStop*Point, Digits ) > 0.0 )
{
if ( NormalizeDouble( Bid - TrailingStop*Point - OrderStopLoss(), Digits ) > 0.0 )
{
if ( !OrderModify( OrderTicket(), OrderOpenPrice(), Bid - TrailingStop*Point, OrderTakeProfit(), 0, TrailingColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè ìîäèôèêàöèè îðäåðà ¹" + OrderTicket() + "!!!" );
}
}
}
continue;
}
if ( OrderType() == OP_SELL )
{
if ( NormalizeDouble( OrderOpenPrice() - Ask - TrailingStop*Point, Digits ) > 0.0 )
{
if ( NormalizeDouble( OrderStopLoss() - ( Ask + TrailingStop*Point ), Digits ) > 0.0 || OrderStopLoss() <= 0 )
{
if ( !OrderModify( OrderTicket(), OrderOpenPrice(), Ask + TrailingStop*Point, OrderTakeProfit(), 0, TrailingColor ) )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè ìîäèôèêàöèè îðäåðà ¹" + OrderTicket() + "!!!" );
}
}
}
continue;
}
}
}
}
//---- îòêðûòèå áàé ïîçèöèè
void vHandsTrade_OpenBuy()
{
//---- åñëè ëèíèÿ îòêðûòèÿ áàé áûëà ïåðåìåùåíà,
double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel; int _GetLastError;
if ( left[1] != ObjectGet( "vHT_Buy_OP", OBJPROP_TIME1 ) || right[1]!= ObjectGet( "vHT_Buy_OP", OBJPROP_TIME2 ) ||
up[2] != ObjectGet( "vHT_Buy_OP", OBJPROP_PRICE1 ) || up[2] != ObjectGet( "vHT_Buy_OP", OBJPROP_PRICE2 ) )
{
//---- åñëè ëèíèþ óäàëèëè, âûõîäèì
if ( GetLastError() == 4202 ) { NeedRedrawObjects = true; return(0); }
if ( GetTickCount() - lastB < MIN_TRADE_PAUSE_MS ) { NeedRedrawObjects = true; return(0); }
lastB = GetTickCount();
double stoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL )*Point + Point;
//---- à åñëè íåò, âûñ÷èòûâàåì óðîâåíü îòêðûòèÿ,
_OpenPriceLevel = NormalizeDouble( Ask, Digits );
//---- åñëè ëèíèÿ ÑË áàé ïîçèöèè áûëà ïåðåìåùåíà,
if ( left[1] != ObjectGet( "vHT_Buy_SL", OBJPROP_TIME1 ) || right[1]!= ObjectGet( "vHT_Buy_SL", OBJPROP_TIME2 ) ||
up[3] != ObjectGet( "vHT_Buy_SL", OBJPROP_PRICE1 ) || up[3] != ObjectGet( "vHT_Buy_SL", OBJPROP_PRICE2 ) )
{
//---- óðîâåíü ÑË óêàçàí - ýòî êîîðäèíàòà ëèíèè
_StopLossLevel = NormalizeDouble( ObjectGet( "vHT_Buy_SL", OBJPROP_PRICE1 ), Digits );
}
//---- à åñëè ëèíèÿ ÑË íà ìåñòå,
else
{
//---- åñëè òåêóùèé âûáðàííûé ÑË áîëüøå 0 (âêëþ÷åí), ñ÷èòàåì óðîâåíü ÑË îò öåíû îòêðûòèÿ
if ( StopLoss > 0 )
{ _StopLossLevel = NormalizeDouble( _OpenPriceLevel - StopLoss*Point, Digits ); }
else
{ _StopLossLevel = 0.0; }
}
if ( _StopLossLevel > 0.0 && NormalizeDouble( Bid - _StopLossLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ Buy-ïîçèöèè!!!" );
return(0);
}
//---- ÒÏ - òî æå ñàìîå
if ( left[1] != ObjectGet( "vHT_Buy_TP", OBJPROP_TIME1 ) || right[1]!= ObjectGet( "vHT_Buy_TP", OBJPROP_TIME2 ) ||
up[1] != ObjectGet( "vHT_Buy_TP", OBJPROP_PRICE1 ) || up[1] != ObjectGet( "vHT_Buy_TP", OBJPROP_PRICE2 ) )
{
_TakeProfitLevel = NormalizeDouble( ObjectGet( "vHT_Buy_TP", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( TakeProfit > 0 )
{ _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel + TakeProfit*Point, Digits ); }
else
{ _TakeProfitLevel = 0.0; }
}
if ( _TakeProfitLevel > 0.0 && NormalizeDouble( _TakeProfitLevel - Bid - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ Buy-ïîçèöèè!!!" );
return(0);
}
//---- ðàñ÷èòûâàåì ëîò
double UseLot = LotSize();
if ( UseLot < 0 ) { return(0); }
//---- è îòêðûâàåì ïîçèöèþ ;)
if ( OrderSend( Symbol(), OP_BUY, UseLot, _OpenPriceLevel, 3, _StopLossLevel, _TakeProfitLevel, "vHandsTrade", 0, BuyOPColor ) < 0 )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè îòêðûòèè Buy-ïîçèöèè!!!" );
}
else
{
//---- äåëàåì ïîìåòêó, ÷òî íàäî ïåðåðèñîâàòüñÿ...
NeedRedrawObjects = true;
MultiComment( "Buy-ïîçèöèÿ îòêðûòà óñïåøíî!" );
}
}
}
void vHandsTrade_OpenBuyStop()
{
double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel; int _Expiration, _GetLastError;
if ( left[0] != ObjectGet( "vHT_BuyStop_OP", OBJPROP_TIME1 ) || right[0]!= ObjectGet( "vHT_BuyStop_OP", OBJPROP_TIME2 ) ||
up[2] != ObjectGet( "vHT_BuyStop_OP", OBJPROP_PRICE1 ) || up[2] != ObjectGet( "vHT_BuyStop_OP", OBJPROP_PRICE2 ) )
{
//---- åñëè ëèíèþ óäàëèëè, âûõîäèì
if ( GetLastError() == 4202 ) { NeedRedrawObjects = true; return(0); }
if ( GetTickCount() - lastBS < MIN_TRADE_PAUSE_MS ) { NeedRedrawObjects = true; return(0); }
lastBS = GetTickCount();
double stoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL )*Point + Point;
double spread = MarketInfo( Symbol(), MODE_SPREAD )*Point;
_OpenPriceLevel = NormalizeDouble( ObjectGet( "vHT_BuyStop_OP", OBJPROP_PRICE1 ), Digits );
if ( NormalizeDouble( _OpenPriceLevel - Ask - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé óðîâåíü îòêðûòèÿ BuyStop-îðäåðà!!!" );
return(0);
}
if ( left[0] != ObjectGet( "vHT_BuyStop_SL", OBJPROP_TIME1 ) || right[0]!= ObjectGet( "vHT_BuyStop_SL", OBJPROP_TIME2 ) ||
up[3] != ObjectGet( "vHT_BuyStop_SL", OBJPROP_PRICE1 ) || up[3] != ObjectGet( "vHT_BuyStop_SL", OBJPROP_PRICE2 ) )
{
_StopLossLevel = NormalizeDouble( ObjectGet( "vHT_BuyStop_SL", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( StopLoss > 0 )
{ _StopLossLevel = NormalizeDouble( _OpenPriceLevel - StopLoss*Point, Digits ); }
else
{ _StopLossLevel = 0.0; }
}
if ( _StopLossLevel > 0.0 && NormalizeDouble( (_OpenPriceLevel - spread) - _StopLossLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ BuyStop-îðäåðà!!!" );
return(0);
}
if ( left[0] != ObjectGet( "vHT_BuyStop_TP", OBJPROP_TIME1 ) || right[0]!= ObjectGet( "vHT_BuyStop_TP", OBJPROP_TIME2 ) ||
up[1] != ObjectGet( "vHT_BuyStop_TP", OBJPROP_PRICE1 ) || up[1] != ObjectGet( "vHT_BuyStop_TP", OBJPROP_PRICE2 ) )
{
_TakeProfitLevel = NormalizeDouble( ObjectGet( "vHT_BuyStop_TP", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( TakeProfit > 0 )
{ _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel + TakeProfit*Point, Digits ); }
else
{ _TakeProfitLevel = 0.0; }
}
if ( _TakeProfitLevel > 0.0 && NormalizeDouble( _TakeProfitLevel - (_OpenPriceLevel - spread) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ BuyStop-îðäåðà!!!" );
return(0);
}
if ( Expiration > 0 )
{ _Expiration = CurTime() + Expiration; }
else
{ _Expiration = 0; }
double UseLot = LotSize();
if ( UseLot < 0 ) { return(0); }
if ( OrderSend( Symbol(), OP_BUYSTOP, UseLot, _OpenPriceLevel, 3, _StopLossLevel, _TakeProfitLevel, "vHandsTrade", 0, _Expiration, BuyOPColor ) < 0 )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè óñòàíîâêå BuyStop-îðäåðà!!!" );
}
else
{
NeedRedrawObjects = true;
MultiComment( "BuyStop-îðäåð óñòàíîâëåí óñïåøíî!" );
}
}
}
void vHandsTrade_OpenBuyLimit()
{
double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel; int _Expiration, _GetLastError;
if ( left[0] != ObjectGet( "vHT_BuyLimit_OP", OBJPROP_TIME1 ) || right[0]!= ObjectGet( "vHT_BuyLimit_OP", OBJPROP_TIME2 ) ||
up[6] != ObjectGet( "vHT_BuyLimit_OP", OBJPROP_PRICE1 ) || up[6] != ObjectGet( "vHT_BuyLimit_OP", OBJPROP_PRICE2 ) )
{
//---- åñëè ëèíèþ óäàëèëè, âûõîäèì
if ( GetLastError() == 4202 ) { NeedRedrawObjects = true; return(0); }
if ( GetTickCount() - lastBL < MIN_TRADE_PAUSE_MS ) { NeedRedrawObjects = true; return(0); }
lastBL = GetTickCount();
double stoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL )*Point + Point;
double spread = MarketInfo( Symbol(), MODE_SPREAD )*Point;
_OpenPriceLevel = NormalizeDouble( ObjectGet( "vHT_BuyLimit_OP", OBJPROP_PRICE1 ), Digits );
if ( NormalizeDouble( Ask - _OpenPriceLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé óðîâåíü îòêðûòèÿ BuyLimit-îðäåðà!!!" );
return(0);
}
if ( left[0] != ObjectGet( "vHT_BuyLimit_SL", OBJPROP_TIME1 ) || right[0]!= ObjectGet( "vHT_BuyLimit_SL", OBJPROP_TIME2 ) ||
up[7] != ObjectGet( "vHT_BuyLimit_SL", OBJPROP_PRICE1 ) || up[7] != ObjectGet( "vHT_BuyLimit_SL", OBJPROP_PRICE2 ) )
{
_StopLossLevel = NormalizeDouble( ObjectGet( "vHT_BuyLimit_SL", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( StopLoss > 0 )
{ _StopLossLevel = NormalizeDouble( _OpenPriceLevel - StopLoss*Point, Digits ); }
else
{ _StopLossLevel = 0.0; }
}
if ( _StopLossLevel > 0.0 && NormalizeDouble( (_OpenPriceLevel - spread) - _StopLossLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ BuyLimit-îðäåðà!!!" );
return(0);
}
if ( left[0] != ObjectGet( "vHT_BuyLimit_TP", OBJPROP_TIME1 ) || right[0]!= ObjectGet( "vHT_BuyLimit_TP", OBJPROP_TIME2 ) ||
up[5] != ObjectGet( "vHT_BuyLimit_TP", OBJPROP_PRICE1 ) || up[5] != ObjectGet( "vHT_BuyLimit_TP", OBJPROP_PRICE2 ) )
{
_TakeProfitLevel = NormalizeDouble( ObjectGet( "vHT_BuyLimit_TP", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( TakeProfit > 0 )
{ _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel + TakeProfit*Point, Digits ); }
else
{ _TakeProfitLevel = 0.0; }
}
if ( _TakeProfitLevel > 0.0 && NormalizeDouble( _TakeProfitLevel - (_OpenPriceLevel - spread) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ BuyLimit-îðäåðà!!!" );
return(0);
}
if ( Expiration > 0 )
{ _Expiration = CurTime() + Expiration; }
else
{ _Expiration = 0; }
double UseLot = LotSize();
if ( UseLot < 0 ) { return(0); }
if ( OrderSend( Symbol(), OP_BUYLIMIT, UseLot, _OpenPriceLevel, 3, _StopLossLevel, _TakeProfitLevel, "vHandsTrade", 0, _Expiration, BuyOPColor ) < 0 )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè óñòàíîâêå BuyLimit-îðäåðà!!!" );
}
else
{
NeedRedrawObjects = true;
MultiComment( "BuyLimit-îðäåð óñòàíîâëåí óñïåøíî!" );
}
}
}
void vHandsTrade_OpenSell()
{
double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel; int _GetLastError;
if ( left[1] != ObjectGet( "vHT_Sell_OP", OBJPROP_TIME1 ) || right[1]!= ObjectGet( "vHT_Sell_OP", OBJPROP_TIME2 ) ||
up[6] != ObjectGet( "vHT_Sell_OP", OBJPROP_PRICE1 ) || up[6] != ObjectGet( "vHT_Sell_OP", OBJPROP_PRICE2 ) )
{
//---- åñëè ëèíèþ óäàëèëè, âûõîäèì
if ( GetLastError() == 4202 ) { NeedRedrawObjects = true; return(0); }
if ( GetTickCount() - lastS < MIN_TRADE_PAUSE_MS ) { NeedRedrawObjects = true; return(0); }
lastS = GetTickCount();
double stoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL )*Point + Point;
_OpenPriceLevel = NormalizeDouble( Bid, Digits );
if ( left[1] != ObjectGet( "vHT_Sell_SL", OBJPROP_TIME1 ) || right[1]!= ObjectGet( "vHT_Sell_SL", OBJPROP_TIME2 ) ||
up[5] != ObjectGet( "vHT_Sell_SL", OBJPROP_PRICE1 ) || up[5] != ObjectGet( "vHT_Sell_SL", OBJPROP_PRICE2 ) )
{
_StopLossLevel = NormalizeDouble( ObjectGet( "vHT_Sell_SL", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( StopLoss > 0 )
{ _StopLossLevel = NormalizeDouble( _OpenPriceLevel + StopLoss*Point, Digits ); }
else
{ _StopLossLevel = 0.0; }
}
if ( _StopLossLevel > 0.0 && NormalizeDouble( _StopLossLevel - Ask - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ Sell-ïîçèöèè!!!" );
return(0);
}
if ( left[1] != ObjectGet( "vHT_Sell_TP", OBJPROP_TIME1 ) || right[1]!= ObjectGet( "vHT_Sell_TP", OBJPROP_TIME2 ) ||
up[7] != ObjectGet( "vHT_Sell_TP", OBJPROP_PRICE1 ) || up[7] != ObjectGet( "vHT_Sell_TP", OBJPROP_PRICE2 ) )
{
_TakeProfitLevel = NormalizeDouble( ObjectGet( "vHT_Sell_TP", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( TakeProfit > 0 )
{ _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel - TakeProfit*Point, Digits ); }
else
{ _TakeProfitLevel = 0.0; }
}
if ( _TakeProfitLevel > 0.0 && NormalizeDouble( Ask - _TakeProfitLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ Sell-ïîçèöèè!!!" );
return(0);
}
double UseLot = LotSize();
if ( UseLot < 0 ) { return(0); }
if ( OrderSend( Symbol(), OP_SELL, UseLot, _OpenPriceLevel, 3, _StopLossLevel, _TakeProfitLevel, "vHandsTrade", 0, SellOPColor ) < 0 )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè îòêðûòèè Sell-ïîçèöèè!!!" );
}
else
{
NeedRedrawObjects = true;
MultiComment( "Sell-ïîçèöèÿ îòêðûòà óñïåøíî!" );
}
}
}
void vHandsTrade_OpenSellStop()
{
double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel; int _Expiration, _GetLastError;
if ( left[2] != ObjectGet( "vHT_SellStop_OP", OBJPROP_TIME1 ) || right[2]!= ObjectGet( "vHT_SellStop_OP", OBJPROP_TIME2 ) ||
up[6] != ObjectGet( "vHT_SellStop_OP", OBJPROP_PRICE1 ) || up[6] != ObjectGet( "vHT_SellStop_OP", OBJPROP_PRICE2 ) )
{
//---- åñëè ëèíèþ óäàëèëè, âûõîäèì
if ( GetLastError() == 4202 ) { NeedRedrawObjects = true; return(0); }
if ( GetTickCount() - lastSS < MIN_TRADE_PAUSE_MS ) { NeedRedrawObjects = true; return(0); }
lastSS = GetTickCount();
double stoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL )*Point + Point;
double spread = MarketInfo( Symbol(), MODE_SPREAD )*Point;
_OpenPriceLevel = NormalizeDouble( ObjectGet( "vHT_SellStop_OP", OBJPROP_PRICE1 ), Digits );
if ( NormalizeDouble( Bid - _OpenPriceLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé óðîâåíü îòêðûòèÿ SellStop-îðäåðà!!!" );
return(0);
}
if ( left[2] != ObjectGet( "vHT_SellStop_SL", OBJPROP_TIME1 ) || right[2]!= ObjectGet( "vHT_SellStop_SL", OBJPROP_TIME2 ) ||
up[5] != ObjectGet( "vHT_SellStop_SL", OBJPROP_PRICE1 ) || up[5] != ObjectGet( "vHT_SellStop_SL", OBJPROP_PRICE2 ) )
{
_StopLossLevel = NormalizeDouble( ObjectGet( "vHT_SellStop_SL", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( StopLoss > 0 )
{ _StopLossLevel = NormalizeDouble( _OpenPriceLevel + StopLoss*Point, Digits ); }
else
{ _StopLossLevel = 0.0; }
}
if ( _StopLossLevel > 0.0 && NormalizeDouble( _StopLossLevel - (_OpenPriceLevel + spread) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ SellStop-îðäåðà!!!" );
return(0);
}
if ( left[2] != ObjectGet( "vHT_SellStop_TP", OBJPROP_TIME1 ) || right[2]!= ObjectGet( "vHT_SellStop_TP", OBJPROP_TIME2 ) ||
up[7] != ObjectGet( "vHT_SellStop_TP", OBJPROP_PRICE1 ) || up[7] != ObjectGet( "vHT_SellStop_TP", OBJPROP_PRICE2 ) )
{
_TakeProfitLevel = NormalizeDouble( ObjectGet( "vHT_SellStop_TP", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( TakeProfit > 0 )
{ _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel - TakeProfit*Point, Digits ); }
else
{ _TakeProfitLevel = 0.0; }
}
if ( _TakeProfitLevel > 0.0 && NormalizeDouble( (_OpenPriceLevel + spread) - _TakeProfitLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ SellStop-îðäåðà!!!" );
return(0);
}
if ( Expiration > 0 )
{ _Expiration = CurTime() + Expiration; }
else
{ _Expiration = 0; }
double UseLot = LotSize();
if ( UseLot < 0 ) { return(0); }
if ( OrderSend( Symbol(), OP_SELLSTOP, UseLot, _OpenPriceLevel, 3, _StopLossLevel, _TakeProfitLevel, "vHandsTrade", 0, _Expiration, SellOPColor ) < 0 )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè óñòàíîâêå SellStop-îðäåðà!!!" );
}
else
{
NeedRedrawObjects = true;
MultiComment( "SellStop-îðäåð óñòàíîâëåí óñïåøíî!" );
}
}
}
void vHandsTrade_OpenSellLimit()
{
double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel; int _Expiration, _GetLastError;
if ( left[2] != ObjectGet( "vHT_SellLimit_OP", OBJPROP_TIME1 ) || right[2]!= ObjectGet( "vHT_SellLimit_OP", OBJPROP_TIME2 ) ||
up[2] != ObjectGet( "vHT_SellLimit_OP", OBJPROP_PRICE1 ) || up[2] != ObjectGet( "vHT_SellLimit_OP", OBJPROP_PRICE2 ) )
{
//---- åñëè ëèíèþ óäàëèëè, âûõîäèì
if ( GetLastError() == 4202 ) { NeedRedrawObjects = true; return(0); }
if ( GetTickCount() - lastSL < MIN_TRADE_PAUSE_MS ) { NeedRedrawObjects = true; return(0); }
lastSL = GetTickCount();
double stoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL )*Point + Point;
double spread = MarketInfo( Symbol(), MODE_SPREAD )*Point;
_OpenPriceLevel = NormalizeDouble( ObjectGet( "vHT_SellLimit_OP", OBJPROP_PRICE1 ), Digits );
if ( NormalizeDouble( _OpenPriceLevel - Bid - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé óðîâåíü îòêðûòèÿ SellLimit-îðäåðà!!!" );
return(0);
}
if ( left[2] != ObjectGet( "vHT_SellLimit_SL", OBJPROP_TIME1 ) || right[2]!= ObjectGet( "vHT_SellLimit_SL", OBJPROP_TIME2 ) ||
up[1] != ObjectGet( "vHT_SellLimit_SL", OBJPROP_PRICE1 ) || up[1] != ObjectGet( "vHT_SellLimit_SL", OBJPROP_PRICE2 ) )
{
_StopLossLevel = NormalizeDouble( ObjectGet( "vHT_SellLimit_SL", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( StopLoss > 0 )
{ _StopLossLevel = NormalizeDouble( _OpenPriceLevel + StopLoss*Point, Digits ); }
else
{ _StopLossLevel = 0.0; }
}
if ( _StopLossLevel > 0.0 && NormalizeDouble( _StopLossLevel - (_OpenPriceLevel + spread) - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÑòîïËîññ äëÿ SellLimit-îðäåðà!!!" );
return(0);
}
if ( left[2] != ObjectGet( "vHT_SellLimit_TP", OBJPROP_TIME1 ) || right[2]!= ObjectGet( "vHT_SellLimit_TP", OBJPROP_TIME2 ) ||
up[3] != ObjectGet( "vHT_SellLimit_TP", OBJPROP_PRICE1 ) || up[3] != ObjectGet( "vHT_SellLimit_TP", OBJPROP_PRICE2 ) )
{
_TakeProfitLevel = NormalizeDouble( ObjectGet( "vHT_SellLimit_TP", OBJPROP_PRICE1 ), Digits );
}
else
{
if ( TakeProfit > 0 )
{ _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel - TakeProfit*Point, Digits ); }
else
{ _TakeProfitLevel = 0.0; }
}
if ( _TakeProfitLevel > 0.0 && NormalizeDouble( (_OpenPriceLevel + spread) - _TakeProfitLevel - stoplevel, Digits ) <= 0.0 )
{
MultiComment( "Íåïðàâèëüíûé ÒåéêÏðîôèò äëÿ SellLimit-îðäåðà!!!" );
return(0);
}
if ( Expiration > 0 )
{ _Expiration = CurTime() + Expiration; }
else
{ _Expiration = 0; }
double UseLot = LotSize();
if ( UseLot < 0 ) { return(0); }
if ( OrderSend( Symbol(), OP_SELLLIMIT, UseLot, _OpenPriceLevel, 3, _StopLossLevel, _TakeProfitLevel, "vHandsTrade", 0, _Expiration, SellOPColor ) < 0 )
{
_GetLastError = GetLastError();
MultiComment( "Îøèáêà #" + _GetLastError + " ïðè óñòàíîâêå SellLimit-îðäåðà!!!" );
}
else
{
NeedRedrawObjects = true;
MultiComment( "SellLimit-îðäåð óñòàíîâëåí óñïåøíî!" );
}
}
}
void vHandsTrade_ReCount()
{
BarsInWindow = BarsPerWindow();
SecondsInBar = Period() * 60;
WindowHighest = High[Highest(NULL,0,MODE_HIGH,BarsInWindow*4/5,0)];
WindowLowest = Low [Lowest (NULL,0,MODE_LOW, BarsInWindow*4/5,0)];
//---- åñëè ïîÿâèëñÿ íîâûé áàð, âñå êîîðäèíàòû èçìåíèëèñü - íàäî ïåðåðèñîâûâàòü
if ( preTime != Time[0] ) { NeedRedrawObjects = true; }
preTime = Time[0];
//---- åñëè èçìåíèëñÿ ðàçìåð îêíà, òà æå ñèòàöèÿ - íàäî ïåðåðèñîâûâàòü
if ( BarsInWindow != preBarsInWindow || WindowHighest != preWindowHighest || WindowLowest != preWindowLowest ) { NeedRedrawObjects = true; }
preBarsInWindow = BarsInWindow; preWindowHighest = WindowHighest; preWindowLowest = WindowLowest;
//---- à åñëè íå íàäî ïåðåðèñîâûâàòü, òî è ïåðåñ÷èòûâàòü íå íàäî =)
if ( NeedRedrawObjects == false ) { return(0); }
Panel_Width = MathMax( 7, (MathCeil(BarsInWindow/5.0/3.0)*3+1-3) )*SecondsInBar;
Panel_T1 = Time[0] + (BarsInWindow/75+1)*SecondsInBar;
Panel_T2 = Panel_T1+Panel_Width;
Panel_P1 = WindowHighest-(WindowHighest-WindowLowest)/10;
Panel_P2 = WindowLowest +(WindowHighest-WindowLowest)/10;
Shag_X = MathFloor( Panel_Width/7.0 );
Zazor_X = SecondsInBar*MathMax(1.0, MathCeil(Panel_Width/SecondsInBar/25));
Dlina_X = MathMax(1.0, MathCeil((Panel_Width-4*Zazor_X)/3) );
Shag_Y = (Panel_P1-Panel_P2)/17;
left[0] = Panel_T1 + Zazor_X;
left[1] = left[0] + Dlina_X + Zazor_X;
left[2] = left[1] + Dlina_X + Zazor_X;
right[0] = left[0] + Dlina_X;
right[1] = left[1] + Dlina_X;
right[2] = left[2] + Dlina_X;
up[0] = Panel_P1 - 0.5*Shag_Y;
up[1] = Panel_P1 - 2.0*Shag_Y;
up[2] = Panel_P1 - 3.0*Shag_Y;
up[3] = Panel_P1 - 4.0*Shag_Y;
up[4] = Panel_P1 - 5.0*Shag_Y;
up[5] = Panel_P1 - 6.5*Shag_Y;
up[6] = Panel_P1 - 7.5*Shag_Y;
up[7] = Panel_P1 - 8.5*Shag_Y;
up[8] = Panel_P1 - 9.6*Shag_Y;
up[9] = Panel_P1 - 10.8*Shag_Y;
up[10] = Panel_P1 - 12.0*Shag_Y;
up[11] = Panel_P1 - 13.2*Shag_Y;
up[12] = Panel_P1 - 14.4*Shag_Y;
up[13] = Panel_P1 - 15.6*Shag_Y;
}
void vHandsTrade_RefreshObjects()
{
//---- íå íàäî ðèñîâàòü - âûõîäèì
if ( NeedRedrawObjects == false ) { return(0); }
//---- ðèñóåì )
ObjectDelete( "vHT_Panel" );
if ( ObjectCreate( "vHT_Panel", OBJ_RECTANGLE, 0, Panel_T1, Panel_P1, Panel_T2, Panel_P2 ) )
{
ObjectSet ( "vHT_Panel", OBJPROP_COLOR, MainColor );
ObjectSet ( "vHT_Panel", OBJPROP_BACK, false );
}
GetLastError();
CreateText( "vHT_BuyStop", left[0]+Dlina_X/2, up[0], "BuyStop", 8, "Arial", MainColor );
CreateLine( "vHT_BuyStop_TP", left[0], up[1], right[0], up[1], STYLE_DOT, 1, BuyColor );
CreateLine( "vHT_BuyStop_OP", left[0], up[2], right[0], up[2], STYLE_DASH, 1, BuyColor );
CreateLine( "vHT_BuyStop_SL", left[0], up[3], right[0], up[3], STYLE_DASHDOT, 1, BuyColor );
CreateText( "vHT_Buy", left[1]+Dlina_X/2, up[0], "Buy", 8, "Arial", MainColor );
CreateLine( "vHT_Buy_TP", left[1], up[1], right[1], up[1], STYLE_DOT, 1, BuyOPColor );
CreateLine( "vHT_Buy_OP", left[1], up[2], right[1], up[2], STYLE_SOLID, 1, BuyOPColor );
CreateLine( "vHT_Buy_SL", left[1], up[3], right[1], up[3], STYLE_DASHDOT, 1, BuyOPColor );
CreateText( "vHT_SellLimit", left[2]+Dlina_X/2, up[0], "SellLimit", 8, "Arial", MainColor );
CreateLine( "vHT_SellLimit_SL", left[2], up[1], right[2], up[1], STYLE_DASHDOT, 1, SellColor );
CreateLine( "vHT_SellLimit_OP", left[2], up[2], right[2], up[2], STYLE_DASH, 1, SellColor );
CreateLine( "vHT_SellLimit_TP", left[2], up[3], right[2], up[3], STYLE_DOT, 1, SellColor );
CreateText( "vHT_BuyLimit", left[0]+Dlina_X/2, up[4], "BuyLimit", 8, "Arial", MainColor );
CreateLine( "vHT_BuyLimit_TP", left[0], up[5], right[0], up[5], STYLE_DOT, 1, BuyColor );
CreateLine( "vHT_BuyLimit_OP", left[0], up[6], right[0], up[6], STYLE_DASH, 1, BuyColor );
CreateLine( "vHT_BuyLimit_SL", left[0], up[7], right[0], up[7], STYLE_DASHDOT, 1, BuyColor );
CreateText( "vHT_Sell", left[1]+Dlina_X/2, up[4], "Sell", 8, "Arial", MainColor );
CreateLine( "vHT_Sell_SL", left[1], up[5], right[1], up[5], STYLE_DASHDOT, 1, SellOPColor );
CreateLine( "vHT_Sell_OP", left[1], up[6], right[1], up[6], STYLE_SOLID, 1, SellOPColor );
CreateLine( "vHT_Sell_TP", left[1], up[7], right[1], up[7], STYLE_DOT, 1, SellOPColor );
CreateText( "vHT_SellStop", left[2]+Dlina_X/2, up[4], "SellStop", 8, "Arial", MainColor );
CreateLine( "vHT_SellStop_SL", left[2], up[5], right[2], up[5], STYLE_DASHDOT, 1, SellColor );
CreateLine( "vHT_SellStop_OP", left[2], up[6], right[2], up[6], STYLE_DASH, 1, SellColor );
CreateLine( "vHT_SellStop_TP", left[2], up[7], right[2], up[7], STYLE_DOT, 1, SellColor );
CreateText( "vHT_Risk0", Panel_T1+1*Shag_X, up[8], "Risk", 8, "Arial", MainColor );
for ( int i = 1; i < 6; i ++ )
{
CreateText( "vHT_Risk" + i, Panel_T1+(i+1)*Shag_X, up[8], RISK[i-1], 8, "Arial", MainColor );
}
ObjectSet ( "vHT_Risk" + SELECTED_RISK, OBJPROP_COLOR, SelectColor );
CreateText( "vHT_Lot0", Panel_T1+1*Shag_X, up[9], "Lot", 8, "Arial", MainColor );
for ( i = 1; i < 6; i ++ )
{
CreateText( "vHT_Lot" + i, Panel_T1+(i+1)*Shag_X, up[9], DoubleToStr( LOT[i-1], vhtLotDigits ), 8, "Arial", MainColor );
}
ObjectSet ( "vHT_Lot" + SELECTED_LOT, OBJPROP_COLOR, SelectColor );
CreateText( "vHT_StopLoss0", Panel_T1+1*Shag_X, up[10], "SL", 8, "Arial", MainColor );
for ( i = 1; i < 6; i ++ )
{
CreateText( "vHT_StopLoss" + i, Panel_T1+(i+1)*Shag_X, up[10], STOPLOSS[i-1], 8, "Arial", MainColor );
}
ObjectSet ( "vHT_StopLoss" + SELECTED_STOPLOSS, OBJPROP_COLOR, SelectColor );
CreateText( "vHT_TakeProfit0", Panel_T1+1*Shag_X, up[11], "TP", 8, "Arial", MainColor );
for ( i = 1; i < 6; i ++ )
{
CreateText( "vHT_TakeProfit" + i, Panel_T1+(i+1)*Shag_X, up[11], TAKEPROFIT[i-1], 8, "Arial", MainColor );
}
ObjectSet ( "vHT_TakeProfit" + SELECTED_TAKEPROFIT, OBJPROP_COLOR, SelectColor );
CreateText( "vHT_TrailingStop0", Panel_T1+1*Shag_X, up[12], "TS", 8, "Arial", MainColor );
for ( i = 1; i < 6; i ++ )
{
CreateText( "vHT_TrailingStop" + i, Panel_T1+(i+1)*Shag_X, up[12], TRAILINGSTOP[i-1], 8, "Arial", MainColor );
}
ObjectSet ( "vHT_TrailingStop" + SELECTED_TRAILINGSTOP, OBJPROP_COLOR, SelectColor );
CreateText( "vHT_Expiration0", Panel_T1+1*Shag_X, up[13], "Exp", 8, "Arial", MainColor );
for ( i = 1; i < 6; i ++ )
{
string exp = DoubleToStr( EXPIRATION[i-1], 0 );
if ( EXPIRATION[i-1]-NormalizeDouble(EXPIRATION[i-1],0) != 0 ) { exp = DoubleToStr( EXPIRATION[i-1], 1 ); }
CreateText( "vHT_Expiration" + i, Panel_T1+(i+1)*Shag_X, up[13], exp, 8, "Arial", MainColor );
}
ObjectSet ( "vHT_Expiration" + SELECTED_EXPIRATION, OBJPROP_COLOR, SelectColor );
GetLastError();
ObjectsRedraw();
NeedRedrawObjects = false;
}
void CreateLine( string name, datetime t1, double p1, datetime t2, double p2, int style, int width, color col )
{
ObjectDelete( name );
if ( ObjectCreate( name, OBJ_TREND, 0, t1, p1, t2, p2 ) )
{
ObjectSet ( name, OBJPROP_COLOR , col );
ObjectSet ( name, OBJPROP_RAY , false );
ObjectSet ( name, OBJPROP_STYLE , style );
ObjectSet ( name, OBJPROP_WIDTH , width );
}
GetLastError();
}
void CreateHLine( string name, double p1, int style, int width, color col, string description )
{
ObjectDelete( name );
if ( ObjectCreate( name, OBJ_HLINE, 0, CurTime(), p1 ) )
{
ObjectSet ( name, OBJPROP_COLOR , col );
ObjectSet ( name, OBJPROP_STYLE , style );
ObjectSet ( name, OBJPROP_WIDTH , width );
ObjectSetText( name, description, 8 );
}
GetLastError();
}
void CreateText( string name, datetime t1, double p1, string text, int font_size, string font_name, color col )
{
ObjectDelete( name );
if ( ObjectCreate ( name, OBJ_TEXT, 0, t1, p1 ) )
{
ObjectSetText ( name, text, font_size, font_name, col );
}
GetLastError();
}
void vHandsTrade_DeleteObjects()
{
int objectstotal = ObjectsTotal(); string name = "";
for ( int i = objectstotal; i >= 0; i -- )
{
name = ObjectName(i);
if ( StringSubstr( name, 0, 4 ) == "vHT_" ) { ObjectDelete( name ); }
}
GetLastError();
}
double LotSize()
{
double lot_min = MarketInfo( Symbol(), MODE_MINLOT );
double lot_max = MarketInfo( Symbol(), MODE_MAXLOT );
double lot_step = MarketInfo( Symbol(), MODE_LOTSTEP );
double freemargin = AccountFreeMargin();
int leverage = AccountLeverage();
int lotsize = MarketInfo( Symbol(), MODE_LOTSIZE );
if( lot_min < 0 || lot_max <= 0.0 || lot_step <= 0.0 || lotsize <= 0 )
{
MultiComment( "LotSize: invalid MarketInfo() results [" + lot_min + "," + lot_max + "," + lot_step + "," + lotsize + "]" );
return(-1);
}
if( leverage <= 0 )
{
MultiComment( "LotSize: invalid AccountLeverage() [" + leverage + "]" );
return(-1);
}
double lot = NormalizeDouble( Lot, 2 );
if ( Risk > 0 ) { lot = NormalizeDouble( freemargin * Risk*0.01 * leverage / lotsize, 2 ); }
lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
if ( lot < lot_min ) lot = lot_min;
if ( lot > lot_max ) lot = lot_max;
double margin_after_open = NormalizeDouble( AccountFreeMarginCheck( Symbol(), OP_BUY, lot ), 2 );
if ( margin_after_open < 5 || GetLastError() == 134 )
{
MultiComment( "Íåäîñòàòî÷íî ñâîáîäíûõ ñðåäñòâ äëÿ îòêðûòèÿ ïîçèöèè " + DoubleToStr( lot, 2 ) + " ëîò ( FreeMargin = " + DoubleToStr( freemargin, 2 ) + ")!!!" );
return(-1);
}
return(lot);
}
void MultiComment( string text )
{
string multi = "";
for ( int i = CommentsCount-1; i > 0; i -- )
{
comment[i] = comment[i-1];
}
comment[0] = TimeToStr( CurTime(), TIME_DATE | TIME_SECONDS ) + " - " + text + "\n";
for ( i = 0; i < CommentsCount; i ++ )
{
multi = multi + comment[i];
}
Comment( multi );
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---