Skip to content

Commit bdf1cb0

Browse files
author
EarnForex
authored
1.15
1. Added more logging to clarify what is happening when an opposite position or order is found. 2. Fixed the bug that prevented the EA from opening new positions when an opposite position in the same symbol existed even with a different Magic number in MT5.
1 parent d82b6a5 commit bdf1cb0

2 files changed

Lines changed: 91 additions & 47 deletions

File tree

ChartPatternHelper.mq4

Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//+------------------------------------------------------------------+
66
#property copyright "Copyright © 2024, EarnForex"
77
#property link "https://www.earnforex.com/metatrader-expert-advisors/ChartPatternHelper/"
8-
#property version "1.14"
8+
#property version "1.15"
99
#property strict
1010

1111
#include <stdlib.mqh>
@@ -648,67 +648,83 @@ void AdjustObjects()
648648
{
649649
if (((HaveBuy) && (!HaveBuyPending)))
650650
{
651-
RenameObject(UpperBorderLine);
652-
RenameObject(UpperEntryLine);
653-
RenameObject(EntryChannel);
651+
if ((ObjectFind(0, UpperBorderLine) >= 0) || (ObjectFind(0, EntryChannel) >= 0))
652+
{
653+
Print("Buy position found, renaming chart objects...");
654+
RenameObject(UpperBorderLine);
655+
RenameObject(UpperEntryLine);
656+
RenameObject(EntryChannel);
657+
}
654658
if (OneCancelsOther)
655659
{
656-
RenameObject(LowerBorderLine);
657-
RenameObject(LowerEntryLine);
658-
RenameObject(BorderChannel);
660+
if ((ObjectFind(0, LowerBorderLine) >= 0) || (ObjectFind(0, BorderChannel) >= 0))
661+
{
662+
Print("OCO is on, renaming opposite chart objects...");
663+
RenameObject(LowerBorderLine);
664+
RenameObject(LowerEntryLine);
665+
RenameObject(BorderChannel);
666+
}
659667
}
660668
}
661669
if (((HaveSell) && (!HaveSellPending)))
662670
{
663-
RenameObject(LowerBorderLine);
664-
RenameObject(LowerEntryLine);
665-
RenameObject(EntryChannel);
671+
if ((ObjectFind(0, LowerEntryLine) >= 0) || (ObjectFind(0, EntryChannel) >= 0))
672+
{
673+
Print("Sell position found, renaming chart objects...");
674+
RenameObject(LowerBorderLine);
675+
RenameObject(LowerEntryLine);
676+
RenameObject(EntryChannel);
677+
}
666678
if (OneCancelsOther)
667679
{
668-
RenameObject(UpperBorderLine);
669-
RenameObject(UpperEntryLine);
670-
RenameObject(BorderChannel);
680+
if ((ObjectFind(0, UpperBorderLine) >= 0) || (ObjectFind(0, BorderChannel) >= 0))
681+
{
682+
Print("OCO is on, renaming opposite chart objects...");
683+
RenameObject(UpperBorderLine);
684+
RenameObject(UpperEntryLine);
685+
RenameObject(BorderChannel);
686+
}
671687
}
672688
}
673689
}
674690

675691
void RenameObject(string Object)
676692
{
677-
if (ObjectFind(Object) > -1) // If exists
693+
if (ObjectFind(0, Object) > -1) // If exists
678694
{
679695
Print("Renaming ", Object, ".");
680696
// Get object's type, price/time coordinates, style properties.
681-
int OT = ObjectType(Object);
682-
double Price1 = ObjectGet(Object, OBJPROP_PRICE1);
697+
ENUM_OBJECT OT = (ENUM_OBJECT)ObjectGetInteger(0, Object, OBJPROP_TYPE);
698+
double Price1 = ObjectGetDouble(0, Object, OBJPROP_PRICE, 0);
683699
datetime Time1 = 0;
684700
double Price2 = 0;
685701
datetime Time2 = 0;
686702
double Price3 = 0;
687703
datetime Time3 = 0;
688704
if ((OT == OBJ_TREND) || (OT == OBJ_CHANNEL))
689705
{
690-
Time1 = (datetime)ObjectGet(Object, OBJPROP_TIME1);
691-
Price2 = ObjectGet(Object, OBJPROP_PRICE2);
692-
Time2 = (datetime)ObjectGet(Object, OBJPROP_TIME2);
706+
Time1 = (datetime)ObjectGetInteger(0, Object, OBJPROP_TIME, 0);
707+
Price2 = ObjectGetDouble(0, Object, OBJPROP_PRICE, 1);
708+
Time2 = (datetime)ObjectGetInteger(0, Object, OBJPROP_TIME, 1);
693709
if (OT == OBJ_CHANNEL)
694710
{
695-
Price3 = ObjectGet(Object, OBJPROP_PRICE3);
696-
Time3 = (datetime)ObjectGet(Object, OBJPROP_TIME3);
711+
Price3 = ObjectGetDouble(0, Object, OBJPROP_PRICE, 2);
712+
Time3 = (datetime)ObjectGetInteger(0, Object, OBJPROP_TIME, 2);
697713
}
698714
}
699-
color Color = (color)ObjectGet(Object, OBJPROP_COLOR);
700-
int Style = (int)ObjectGet(Object, OBJPROP_STYLE);
701-
int Width = (int)ObjectGet(Object, OBJPROP_WIDTH);
715+
color Color = (color)ObjectGetInteger(0, Object, OBJPROP_COLOR);
716+
ENUM_LINE_STYLE Style = (ENUM_LINE_STYLE)ObjectGetInteger(0, Object, OBJPROP_STYLE);
717+
int Width = (int)ObjectGetInteger(0, Object, OBJPROP_WIDTH);
702718

703719
// Delete object.
704-
ObjectDelete(Object);
705-
720+
ObjectDelete(0, Object);
721+
string NewObject = Object + IntegerToString(Magic);
706722
// Create the same object with new name and set the old style properties.
707-
ObjectCreate(Object + IntegerToString(Magic), OT, 0, Time1, Price1, Time2, Price2, Time3, Price3);
708-
ObjectSet(Object + IntegerToString(Magic), OBJPROP_COLOR, Color);
709-
ObjectSet(Object + IntegerToString(Magic), OBJPROP_STYLE, Style);
710-
ObjectSet(Object + IntegerToString(Magic), OBJPROP_WIDTH, Width);
711-
ObjectSet(Object + IntegerToString(Magic), OBJPROP_RAY, true);
723+
ObjectCreate(0, NewObject, OT, 0, Time1, Price1, Time2, Price2, Time3, Price3);
724+
ObjectSetInteger(0, NewObject, OBJPROP_COLOR, Color);
725+
ObjectSetInteger(0, NewObject, OBJPROP_STYLE, Style);
726+
ObjectSetInteger(0, NewObject, OBJPROP_WIDTH, Width);
727+
ObjectSetInteger(0, NewObject, OBJPROP_RAY, true);
712728
}
713729
}
714730

ChartPatternHelper.mq5

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//+------------------------------------------------------------------+
66
#property copyright "Copyright © 2024, EarnForex"
77
#property link "https://www.earnforex.com/metatrader-expert-advisors/ChartPatternHelper/"
8-
#property version "1.14"
8+
#property version "1.15"
99

1010
#property description "Uses graphic objects (horizontal/trend lines, channels) to enter trades."
1111
#property description "Works in two modes:"
@@ -671,10 +671,22 @@ void FindOrders()
671671
HaveSellPending = false;
672672
HaveBuy = false;
673673
HaveSell = false;
674-
if (PositionSelect(_Symbol))
674+
if (AccountInfoInteger(ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_NETTING) // Netting:
675+
{
676+
if (PositionSelect(_Symbol))
677+
{
678+
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) HaveBuy = true;
679+
else HaveSell = true;
680+
}
681+
}
682+
else // Hednging/exchange:
675683
{
676-
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) HaveBuy = true;
677-
else HaveSell = true;
684+
for (int i = 0; i < PositionsTotal(); i++)
685+
{
686+
if ((PositionGetString(POSITION_SYMBOL) != _Symbol) || (PositionGetInteger(POSITION_MAGIC) != Magic)) continue;
687+
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) HaveBuy = true;
688+
else HaveSell = true;
689+
}
678690
}
679691
for (int i = 0; i < OrdersTotal(); i++)
680692
{
@@ -697,26 +709,42 @@ void AdjustObjects()
697709
{
698710
if (((HaveBuy) && (!HaveBuyPending)))
699711
{
700-
RenameObject(UpperBorderLine);
701-
RenameObject(UpperEntryLine);
702-
RenameObject(EntryChannel);
712+
if ((ObjectFind(0, UpperBorderLine) >= 0) || (ObjectFind(0, EntryChannel) >= 0))
713+
{
714+
Print("Buy position found, renaming chart objects...");
715+
RenameObject(UpperBorderLine);
716+
RenameObject(UpperEntryLine);
717+
RenameObject(EntryChannel);
718+
}
703719
if (OneCancelsOther)
704720
{
705-
RenameObject(LowerBorderLine);
706-
RenameObject(LowerEntryLine);
707-
RenameObject(BorderChannel);
721+
if ((ObjectFind(0, LowerBorderLine) >= 0) || (ObjectFind(0, BorderChannel) >= 0))
722+
{
723+
Print("OCO is on, renaming opposite chart objects...");
724+
RenameObject(LowerBorderLine);
725+
RenameObject(LowerEntryLine);
726+
RenameObject(BorderChannel);
727+
}
708728
}
709729
}
710730
if (((HaveSell) && (!HaveSellPending)))
711731
{
712-
RenameObject(LowerBorderLine);
713-
RenameObject(LowerEntryLine);
714-
RenameObject(EntryChannel);
732+
if ((ObjectFind(0, LowerEntryLine) >= 0) || (ObjectFind(0, EntryChannel) >= 0))
733+
{
734+
Print("Sell position found, renaming chart objects...");
735+
RenameObject(LowerBorderLine);
736+
RenameObject(LowerEntryLine);
737+
RenameObject(EntryChannel);
738+
}
715739
if (OneCancelsOther)
716740
{
717-
RenameObject(UpperBorderLine);
718-
RenameObject(UpperEntryLine);
719-
RenameObject(BorderChannel);
741+
if ((ObjectFind(0, UpperBorderLine) >= 0) || (ObjectFind(0, BorderChannel) >= 0))
742+
{
743+
Print("OCO is on, renaming opposite chart objects...");
744+
RenameObject(UpperBorderLine);
745+
RenameObject(UpperEntryLine);
746+
RenameObject(BorderChannel);
747+
}
720748
}
721749
}
722750
}

0 commit comments

Comments
 (0)