Dictionary <String, String> selectFor(DataStoreHelper dsh, SelectMode selectMode, ref String sigInfo, int iIndex, out bool isTwoDownMode) { isTwoDownMode = false; var zf = dsh.Ref(Info.ZF, iIndex); if (zf > -0.05 || zf < -0.095) { return(null); } if (!dsh.IsRealDown()) { return(null); } if (zf < -0.09 && dsh.Ref(Info.ZF, iIndex + 1) < -0.08) { return(null); } int iSigDateIndex = -1; int nUStopCount = 0; int nDStopCount = 0; float sigDateVol = 0; float sigZF = 0; int nMeetMinus5PercentCount = 0; int iFirstMinus5PercentIndex = -1; int iTwoMinus5PercentIndex = -1; int nPlus5PercentCount = 0; bool bDanger = false; for (int i = iIndex + 1; i < SearchDayCount; ++i) { var curOf = dsh.Ref(Info.OF, i); var curHf = dsh.Ref(Info.HF, i); var curZf = dsh.Ref(Info.ZF, i); var curLf = dsh.Ref(Info.LF, i); var curPreZf = dsh.Ref(Info.ZF, i + 1); var vol = dsh.Ref(Info.V, i); if (dsh.IsUpStopEveryDay(EveryUpCount, i)) { iSigDateIndex = i; sigDateVol = vol; sigZF = curZf; break; } if (curHf > 0.095 && curZf < 0) { bDanger = true; } } for (int i = iSigDateIndex + EveryUpCount; i < iSigDateIndex + EveryUpCount + SearchDayCount; i++) { if (dsh.IsUpStopEveryDay(EveryUpCount, i)) { return(null); } } for (int i = iSigDateIndex - 1; i > iIndex; --i) { var curOf = dsh.Ref(Info.OF, i); var curHf = dsh.Ref(Info.HF, i); var curZf = dsh.Ref(Info.ZF, i); var curLf = dsh.Ref(Info.LF, i); var curPreZf = dsh.Ref(Info.ZF, i + 1); var vol = dsh.Ref(Info.V, i); if (curZf > 0.095) { nUStopCount++; } else if (curZf < -0.095) { nDStopCount++; } if (curZf < -0.05) { if (iFirstMinus5PercentIndex == -1) { iFirstMinus5PercentIndex = i; } ++nMeetMinus5PercentCount; if (nMeetMinus5PercentCount == 2) { iTwoMinus5PercentIndex = i; } } if (curZf > 0.06) { ++nPlus5PercentCount; } } if (iSigDateIndex == -1) { return(null); } int orgThreshold = 3; int nThreshold = orgThreshold; if (iTwoMinus5PercentIndex != -1) { bool bHasUp = false; for (int i = iIndex + 1; i < iTwoMinus5PercentIndex; i++) { if (dsh.Ref(Info.ZF, i) > 0.01) { bHasUp = true; break; } } if (!bHasUp) { nThreshold++; } } if (nThreshold == orgThreshold) { if (dsh.Ref(Info.ZF, 1 + iIndex) < 0 && dsh.Ref(Info.ZF, 2 + iIndex) < 0) { nThreshold++; } } // if (nDStopCount > 1) // { // return null; // } nThreshold += nPlus5PercentCount; nThreshold += nDStopCount; if (dsh.UpShadow(1) > 0.04 && dsh.Ref(Info.ZF, 1) < 0 && dsh.Ref(Info.ZF) > -0.08) { ++nThreshold; } // nThreshold += (int)Math.Ceiling(nPlus5PercentCount*0.5); if (nMeetMinus5PercentCount < nThreshold - 1) { return(null); } if (nMeetMinus5PercentCount > nThreshold - 1) { if (dsh.Ref(Info.ZF, iIndex + 1) > 0) { return(null); } } var preZF = dsh.Ref(Info.ZF, iIndex + 1); if (preZF > 0.02) { isTwoDownMode = true; return(null); } if (dsh.AccZF(3, iIndex + 1) > 0.02 && dsh.EveryUp(iIndex + 1) >= 3) { isTwoDownMode = true; } if (bDanger) { return(null); } // if (dsh.Ref(Info.C, iIndex) > dsh.Ref(Info.O, iIndex)) // { // return null; // } var ret = new Dictionary <String, String>(); ret[String.Format("Threshold/{0}", nThreshold)] = ""; ret[String.Format("Meet/{0}", nMeetMinus5PercentCount == nThreshold - 1 ? "1" : "0")] = ""; return(ret); }
Dictionary <String, String> IStrategy.select(DataStoreHelper dsh, SelectMode selectMode, ref String sigInfo) { var zf = dsh.Ref(Info.ZF); if (zf > 0.095 || zf < -0.095) { return(null); } if (zf > 0.03 || zf < 0.02) { return(null); } if (!dsh.IsReal()) { return(null); } if (dsh.UpShadow() > 0.04) { return(null); } var of = dsh.Ref(Info.OF); if (of > 0.02 || of < -0.04) { return(null); } if (dsh.Ref(Info.ZF, 1) > -0.005) { return(null); } if (dsh.Ref(Info.ZF, 2) < 0.005 || !dsh.IsReal(2)) { return(null); } if (dsh.Ref(Info.V) > dsh.Ref(Info.V, 1) * 1.5) { return(null); } if ((dsh.Ref(Info.C) - dsh.Ref(Info.C, 2)) / dsh.Ref(Info.C, 1) > 0.01) { return(null); } if (dsh.Ref(Info.C) > dsh.Ref(Info.O, 1)) { return(null); } if ((dsh.Ref(Info.L) - dsh.Ref(Info.L, 2)) / dsh.Ref(Info.C, 1) > 0.01) { return(null); } int nTotalDownDays = dsh.EveryDown(3); if (nTotalDownDays < 4) { return(null); } if (dsh.EveryUp(3 + nTotalDownDays) > nTotalDownDays) { return(null); } float totalZF = dsh.AccZF(nTotalDownDays, 3); if (totalZF > -0.1) { return(null); } var szZF = dsh.SZRef(Info.ZF); if (szZF > 0 && szZF < 0.011 && dsh.SZAcc(Info.ZF, 7, 1) > 0.03) { return(null); } if (!selectBySZ(dsh)) { return(null); } return(EmptyRateItemButSel); }